{
 "cells": [
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T02:21:41.923220Z",
     "start_time": "2025-03-09T02:21:41.921151Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%env LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n",
    "%env LLM_API_KEY=sk-替换为自己的Qwen API Key"
   ],
   "id": "26dd6b35ebc51865",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "env: LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n",
      "env: LLM_API_KEY=sk-替换为自己的Qwen API Key\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T02:21:41.893784Z",
     "start_time": "2025-03-09T02:21:41.891608Z"
    }
   },
   "cell_type": "code",
   "source": "%env DEEPSEEK_API_KEY=sk-替换为自己的DeepSeek API Key",
   "id": "9489913bafe6a98f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "env: DEEPSEEK_API_KEY=sk-替换为自己的DeepSeek API Key\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d92c9592-f0f4-465a-97ec-49af67daf6b7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:26.342309Z",
     "iopub.status.busy": "2025-03-08T16:28:26.342025Z",
     "iopub.status.idle": "2025-03-08T16:28:29.022821Z",
     "shell.execute_reply": "2025-03-08T16:28:29.022219Z",
     "shell.execute_reply.started": "2025-03-08T16:28:26.342281Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m24.1.2\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.0.1\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install -q langchain-deepseek"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b728e7a8-dee3-486f-a193-ec7f519ecfce",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:29.023564Z",
     "iopub.status.busy": "2025-03-08T16:28:29.023410Z",
     "iopub.status.idle": "2025-03-08T16:28:29.026098Z",
     "shell.execute_reply": "2025-03-08T16:28:29.025695Z",
     "shell.execute_reply.started": "2025-03-08T16:28:29.023548Z"
    }
   },
   "outputs": [],
   "source": [
    "%%capture --no-stderr\n",
    "!pip install langchain langchain-community langchain-ollama langchain-deepseek langchain-openai langchain_chroma pypdf sentence_transformers shutil openpyxl FlagEmbedding"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa25b4ef-1e75-49ab-847b-d1525e403913",
   "metadata": {},
   "source": [
    "LangGraph可视化依赖"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b024725e-211d-4512-aafa-888fb85c88fd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:29.027672Z",
     "iopub.status.busy": "2025-03-08T16:28:29.027352Z",
     "iopub.status.idle": "2025-03-08T16:28:29.039528Z",
     "shell.execute_reply": "2025-03-08T16:28:29.038944Z",
     "shell.execute_reply.started": "2025-03-08T16:28:29.027657Z"
    }
   },
   "outputs": [],
   "source": [
    "!sudo apt install -y graphviz libgraphviz-dev\n",
    "!pip install pygraphviz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "27ff306d-e226-48fe-be27-9802436c2258",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:29.040414Z",
     "iopub.status.busy": "2025-03-08T16:28:29.040097Z",
     "iopub.status.idle": "2025-03-08T16:28:29.299119Z",
     "shell.execute_reply": "2025-03-08T16:28:29.298598Z",
     "shell.execute_reply.started": "2025-03-08T16:28:29.040398Z"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "\n",
    "expr_version = 'new_arch_v3_r1_reasoning_rag_671b_r1'\n",
    "\n",
    "preprocess_output_dir = os.path.join(os.path.pardir, 'outputs', 'v1_20240713')\n",
    "expr_dir = os.path.join(os.path.pardir, 'experiments', expr_version)\n",
    "\n",
    "os.makedirs(expr_dir, exist_ok=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1bb5a96c-726c-44e9-a125-abb9e5124ae6",
   "metadata": {},
   "source": [
    "# 加载文档"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9d0220e8-fdcd-4890-acab-45678d4b844f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:29.300025Z",
     "iopub.status.busy": "2025-03-08T16:28:29.299639Z",
     "iopub.status.idle": "2025-03-08T16:28:31.025108Z",
     "shell.execute_reply": "2025-03-08T16:28:31.024670Z",
     "shell.execute_reply.started": "2025-03-08T16:28:29.300010Z"
    }
   },
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import PyPDFLoader\n",
    "\n",
    "loader = PyPDFLoader(os.path.join(os.path.pardir, 'data', '2024全球经济金融展望报告.pdf'))\n",
    "documents = loader.load()\n",
    "\n",
    "qa_df = pd.read_excel(os.path.join(preprocess_output_dir, 'question_answer.xlsx'))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1831ff80-83e6-4b61-8085-5e26b8957af8",
   "metadata": {},
   "source": [
    "# 切分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "85670f78-ec51-4500-98b1-03ab1c3413e3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:31.025916Z",
     "iopub.status.busy": "2025-03-08T16:28:31.025726Z",
     "iopub.status.idle": "2025-03-08T16:28:31.075078Z",
     "shell.execute_reply": "2025-03-08T16:28:31.074604Z",
     "shell.execute_reply.started": "2025-03-08T16:28:31.025902Z"
    }
   },
   "outputs": [],
   "source": [
    "from uuid import uuid4\n",
    "import os\n",
    "import pickle\n",
    "\n",
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "\n",
    "def split_docs(documents, filepath, chunk_size=400, chunk_overlap=40, seperators=['\\n\\n\\n', '\\n\\n'], force_split=False):\n",
    "    if os.path.exists(filepath) and not force_split:\n",
    "        print('found cache, restoring...')\n",
    "        return pickle.load(open(filepath, 'rb'))\n",
    "\n",
    "    splitter = RecursiveCharacterTextSplitter(\n",
    "        chunk_size=chunk_size,\n",
    "        chunk_overlap=chunk_overlap,\n",
    "        separators=seperators\n",
    "    )\n",
    "    split_docs = splitter.split_documents(documents)\n",
    "    for chunk in split_docs:\n",
    "        chunk.metadata['uuid'] = str(uuid4())\n",
    "\n",
    "    pickle.dump(split_docs, open(filepath, 'wb'))\n",
    "\n",
    "    return split_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "edb6468a-6917-4314-bdf1-97ae0a0ebeb2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:31.075826Z",
     "iopub.status.busy": "2025-03-08T16:28:31.075547Z",
     "iopub.status.idle": "2025-03-08T16:28:31.078898Z",
     "shell.execute_reply": "2025-03-08T16:28:31.078571Z",
     "shell.execute_reply.started": "2025-03-08T16:28:31.075812Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "found cache, restoring...\n"
     ]
    }
   ],
   "source": [
    "splitted_docs = split_docs(documents, os.path.join(preprocess_output_dir, 'split_docs.pkl'), chunk_size=500, chunk_overlap=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e3e66f9-600f-4117-9d09-59c99f96727e",
   "metadata": {},
   "source": [
    "# 检索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b1114ffe-e885-4a07-8b91-fd4b7173a2e1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:31.079518Z",
     "iopub.status.busy": "2025-03-08T16:28:31.079392Z",
     "iopub.status.idle": "2025-03-08T16:28:51.803309Z",
     "shell.execute_reply": "2025-03-08T16:28:51.800906Z",
     "shell.execute_reply.started": "2025-03-08T16:28:31.079505Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "device: cuda\n"
     ]
    }
   ],
   "source": [
    "from langchain.embeddings import HuggingFaceBgeEmbeddings\n",
    "from langchain_community.vectorstores import Chroma\n",
    "import torch\n",
    "import shutil\n",
    "\n",
    "from tqdm.auto import tqdm\n",
    "from langchain_community.vectorstores import Chroma\n",
    "\n",
    "\n",
    "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
    "print(f'device: {device}')\n",
    "\n",
    "def get_embeddings(model_path):\n",
    "    embeddings = HuggingFaceBgeEmbeddings(\n",
    "        model_name=model_path,\n",
    "        model_kwargs={'device': device},\n",
    "        encode_kwargs={'normalize_embeddings': True},\n",
    "        # show_progress=True\n",
    "        query_instruction='为这个句子生成表示以用于检索相关文章：'\n",
    "    )\n",
    "    return embeddings\n",
    "\n",
    "\n",
    "model_path = 'BAAI/bge-large-zh-v1.5'\n",
    "embeddings = get_embeddings(model_path)\n",
    "\n",
    "persist_directory = os.path.join(expr_dir, 'chroma', 'bge')\n",
    "shutil.rmtree(persist_directory, ignore_errors=True)\n",
    "vector_db = Chroma.from_documents(\n",
    "    splitted_docs,\n",
    "    embedding=embeddings,\n",
    "    persist_directory=persist_directory\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "265b201b-f1cb-4874-8d2d-0f30a07fa6c5",
   "metadata": {},
   "source": [
    "# 构建流程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "13b76ab4-41c4-44e0-9b59-9e3f5effa50e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:51.807291Z",
     "iopub.status.busy": "2025-03-08T16:28:51.806520Z",
     "iopub.status.idle": "2025-03-08T16:28:52.428757Z",
     "shell.execute_reply": "2025-03-08T16:28:52.428291Z",
     "shell.execute_reply.started": "2025-03-08T16:28:51.807213Z"
    }
   },
   "outputs": [],
   "source": [
    "from langchain_deepseek import ChatDeepSeek\n",
    "from langchain_ollama import ChatOllama\n",
    "\n",
    "r1 = ChatDeepSeek(\n",
    "    model=\"deepseek-reasoner\",\n",
    "    temperature=0.6,\n",
    "    top_p=0.7,\n",
    "    max_tokens=4096\n",
    ")\n",
    "# r1 = ChatOllama(model='deepseek-r1:latest', temperature=0.01)\n",
    "llm = ChatOllama(model='qwen2:7b-instruct')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0768cfb5-300f-4537-a013-b01d8c282099",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.429611Z",
     "iopub.status.busy": "2025-03-08T16:28:52.429282Z",
     "iopub.status.idle": "2025-03-08T16:28:52.431737Z",
     "shell.execute_reply": "2025-03-08T16:28:52.431416Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.429598Z"
    }
   },
   "outputs": [],
   "source": [
    "# resp = r1.invoke('为什么天空是蓝色的')\n",
    "# resp.content结构为：\n",
    "# <think>...</think>..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "13f207e5-a95b-4f06-a8b7-8e64e901f208",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.432367Z",
     "iopub.status.busy": "2025-03-08T16:28:52.432251Z",
     "iopub.status.idle": "2025-03-08T16:28:52.474576Z",
     "shell.execute_reply": "2025-03-08T16:28:52.474066Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.432356Z"
    }
   },
   "outputs": [],
   "source": [
    "from langgraph.graph import END, StateGraph\n",
    "from typing_extensions import TypedDict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "05b43de9-e79d-43e0-b1fa-3d31f4eeadc1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.476940Z",
     "iopub.status.busy": "2025-03-08T16:28:52.476741Z",
     "iopub.status.idle": "2025-03-08T16:28:52.660941Z",
     "shell.execute_reply": "2025-03-08T16:28:52.659985Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.476927Z"
    }
   },
   "outputs": [],
   "source": [
    "class RAGState(TypedDict):\n",
    "    question: str\n",
    "    retrieved_context: str\n",
    "    router_decision: str\n",
    "    answer_to_question: str\n",
    "    missing_information: str\n",
    "    useful_information: str\n",
    "    reasoning: str\n",
    "    n_round: int"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "722bf7de-bf4e-43d8-85a4-73f683750ffa",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.662292Z",
     "iopub.status.busy": "2025-03-08T16:28:52.662032Z",
     "iopub.status.idle": "2025-03-08T16:28:52.668715Z",
     "shell.execute_reply": "2025-03-08T16:28:52.668054Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.662268Z"
    }
   },
   "outputs": [],
   "source": [
    "from langchain_core.prompts import PromptTemplate\n",
    "\n",
    "VALIDATE_PROMPT = PromptTemplate(\n",
    "    input_variables=[\"retrieved_context\", \"question\"],\n",
    "    template=\"\"\"\n",
    "# 任务描述\n",
    "\n",
    "您是一名检索验证员。\n",
    "系统会向您提供一个问题和一些背景信息，这些背景信息可能包含问题的答案，也可能不包含。\n",
    "您的任务是仔细查看这些文本块，并提供包含三个字段的 JSON 响应：\n",
    "\n",
    "1. status：检索到的背景信息是否包含问题的答案。\n",
    "- 如果检索到的背景信息包含问题答案，则为 \"COMPLETE\"，否则为 \"INCOMPLETE\"。只有这两个取值，其他取值都是非法的。\n",
    "\n",
    "2. useful_information：从检索到的背景信息中获取的有用信息。要简洁明了。\n",
    "- 大部分情况下，这部分信息不能为空，如果确实没有有用信息，则将其设置为空字符串。\n",
    "- 如果status是COMPLETE，则这部分一定要有。\n",
    "\n",
    "3. missing_information：如果要完整回答这个问题，还需要的信息，这个信息将用来使用向量模型进一步检索知识库，以便补充信息。\n",
    "- 如果status是INCOMPLETE，则这部分信息一定要有。\n",
    "\n",
    "# 背景信息\n",
    "\n",
    "---\n",
    "{retrieved_context}\n",
    "---\n",
    "\n",
    "# 返回值要求\n",
    "    \n",
    "    请按以下格式以字典形式提供您的答复。请严格按照此格式返回结果，不要包含描述性内容和任何其他无关内容。\n",
    "\n",
    "```json\n",
    "{{\"status\": \"<status>\",\n",
    "\"useful_information\": \"<useful_information>\",\n",
    "\"missing_information\": \"<missing_information>\"}}\n",
    "```\n",
    "    \n",
    "这里是响应的样例：\n",
    "\n",
    "```json\n",
    "{{\"status\": \"COMPLETE\",\n",
    "\"useful_information\": \"The capital city of Canada is Ottawa.\",\n",
    "\"missing_information\": \"The capital city of Mexico\"}}\n",
    "```\n",
    "\n",
    "\n",
    "# 问题\n",
    "\n",
    "{question}\n",
    "    \"\"\"\n",
    ")\n",
    "\n",
    "ANSWER_QUESTION = PromptTemplate(\n",
    "    input_variables=[\"retrieved_context\", \"question\"],\n",
    "    template=\"\"\"\n",
    "你是一个金融分析师，擅长根据所获取的信息片段，对问题进行分析和推理。\n",
    "你的任务是根据所获取的信息片段（<<<<context>>><<<</context>>>之间的内容）回答问题。\n",
    "回答保持简洁，不必重复问题，不要添加描述性解释和与答案无关的任何内容。\n",
    "已知信息：\n",
    "<<<<context>>>\n",
    "{retrieved_context}\n",
    "<<<</context>>>\n",
    "\n",
    "问题：{question}\n",
    "请回答：\n",
    "    \"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7cf22adc-7371-447e-a73c-450887cf5563",
   "metadata": {},
   "source": [
    "## 构建Workflow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "1382b3a7-0ad3-4743-a230-8dbaa6e43016",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.669634Z",
     "iopub.status.busy": "2025-03-08T16:28:52.669421Z",
     "iopub.status.idle": "2025-03-08T16:28:52.676032Z",
     "shell.execute_reply": "2025-03-08T16:28:52.675379Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.669613Z"
    }
   },
   "outputs": [],
   "source": [
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "093ce9eb-b7d6-44fe-86c0-65b09a6f37ca",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.677300Z",
     "iopub.status.busy": "2025-03-08T16:28:52.676920Z",
     "iopub.status.idle": "2025-03-08T16:28:52.683269Z",
     "shell.execute_reply": "2025-03-08T16:28:52.682845Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.677278Z"
    }
   },
   "outputs": [],
   "source": [
    "n_chunks = 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "22491450-92c7-43cf-bc6a-d962219593ef",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.683959Z",
     "iopub.status.busy": "2025-03-08T16:28:52.683800Z",
     "iopub.status.idle": "2025-03-08T16:28:52.689474Z",
     "shell.execute_reply": "2025-03-08T16:28:52.689059Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.683944Z"
    }
   },
   "outputs": [],
   "source": [
    "import re\n",
    "\n",
    "def extract_json(text):\n",
    "    match = re.search(r'\\{.*\\}', text, re.DOTALL)\n",
    "    if match:\n",
    "        try:\n",
    "            return json.loads(match.group())\n",
    "        except json.JSONDecodeError:\n",
    "            print(\"提取的内容不是有效的JSON\")\n",
    "    return None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a410f929-118b-4adb-9b7d-fc29e80ae2e8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.690128Z",
     "iopub.status.busy": "2025-03-08T16:28:52.689980Z",
     "iopub.status.idle": "2025-03-08T16:28:52.695644Z",
     "shell.execute_reply": "2025-03-08T16:28:52.695166Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.690113Z"
    }
   },
   "outputs": [],
   "source": [
    "def retrieve(state: RAGState):\n",
    "    print(f\"\\n=== STEP 1: RETRIEVAL (round: {state.get('n_round', 0)})===\")\n",
    "    \n",
    "    question = state['question']\n",
    "    print(\"Searching for:\", question)\n",
    "    \n",
    "    chunks = vector_db.similarity_search(question, k=n_chunks)\n",
    "    return {'retrieved_context': '\\n\\n'.join([doc.page_content for doc in chunks]), 'n_round': state.get('n_round', 0) + 1}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "457686ad-cb62-4cf4-8f99-ba7516947259",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.696544Z",
     "iopub.status.busy": "2025-03-08T16:28:52.696187Z",
     "iopub.status.idle": "2025-03-08T16:28:52.701887Z",
     "shell.execute_reply": "2025-03-08T16:28:52.701487Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.696528Z"
    }
   },
   "outputs": [],
   "source": [
    "def validate_retrieval(state: RAGState):\n",
    "    print(f\"\\n=== STEP 2: VALIDATION (round: {state.get('n_round', 0)})===\")\n",
    "    question = state['question']\n",
    "    retrieved_context = state['retrieved_context']\n",
    "    # print(\"Retrieved Context:\\n\", retrieved_context)\n",
    "    \n",
    "    validation_chain = VALIDATE_PROMPT | r1\n",
    "    retry_count = 5\n",
    "\n",
    "    # 兜底\n",
    "    router_decision = 'INCOMPLETE'\n",
    "    missing_information = question\n",
    "    useful_information = ''\n",
    "    reasoning = ''\n",
    "    \n",
    "    while retry_count >= 0:\n",
    "        try:\n",
    "            llm_output = validation_chain.invoke({'retrieved_context': retrieved_context, 'question': question})\n",
    "            # print('llm_output:', llm_output)\n",
    "            \n",
    "            # reasoning = llm_output.split('<think>')[1].split('</think>')[0].strip()\n",
    "            reasoning = llm_output.additional_kwargs['reasoning_content']\n",
    "            # response = llm_output.split('</think>')[1].strip()\n",
    "            response = llm_output.content\n",
    "            structured_response = extract_json(response)\n",
    "        \n",
    "            router_decision = structured_response['status'].strip().upper()\n",
    "            missing_information = structured_response['missing_information']\n",
    "            useful_information = structured_response['useful_information']\n",
    "            \n",
    "            print('structured response:', structured_response)\n",
    "            # print('reasoning:', reasoning)\n",
    "            print(\"router decision:\", router_decision)\n",
    "            # print(\"missing information:\", missing_information)\n",
    "            # print('useful information:', useful_information)\n",
    "            \n",
    "            break\n",
    "        except Exception as e:\n",
    "            retry_count -= 1\n",
    "            print(f\"error, e: {e}, llm_output: {llm_output}, {retry_count} retries left\")\n",
    "\n",
    "    return {\n",
    "        'router_decision': router_decision,\n",
    "        'missing_information': missing_information,\n",
    "        'useful_information': useful_information,\n",
    "        'reasoning': reasoning\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "a7d440d6-953b-4655-88ac-f87177539c3a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.702687Z",
     "iopub.status.busy": "2025-03-08T16:28:52.702359Z",
     "iopub.status.idle": "2025-03-08T16:28:52.707809Z",
     "shell.execute_reply": "2025-03-08T16:28:52.707310Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.702673Z"
    }
   },
   "outputs": [],
   "source": [
    "def answer(state: RAGState):\n",
    "    print(f\"\\n=== STEP 3: ANSWERING (round: {state.get('n_round', 0)})===\")\n",
    "\n",
    "    question = state['question']\n",
    "    context = state['retrieved_context']\n",
    "\n",
    "    answer_chain = ANSWER_QUESTION | llm\n",
    "    llm_output = answer_chain.invoke({\n",
    "        'retrieved_context': context,\n",
    "        'question': question\n",
    "    }).content\n",
    "    # answer = llm_output.split('</think>')[1].strip()\n",
    "    answer = llm_output.strip()\n",
    "    print('answer:', answer)\n",
    "    \n",
    "    return {'answer_to_question': answer}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "115102df-dcf4-472c-a0da-84c399f3e0a7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.708671Z",
     "iopub.status.busy": "2025-03-08T16:28:52.708360Z",
     "iopub.status.idle": "2025-03-08T16:28:52.713795Z",
     "shell.execute_reply": "2025-03-08T16:28:52.713412Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.708654Z"
    }
   },
   "outputs": [],
   "source": [
    "def find_missing_information(state: RAGState):\n",
    "    print(f\"\\n=== STEP 2b: FINDING MISSING INFORMATION (round: {state.get('n_round', 0)})===\")\n",
    "    question = state[\"missing_information\"]\n",
    "\n",
    "    print(\"Searching for:\", question)\n",
    "    \n",
    "    chunks = vector_db.similarity_search(question, k=n_chunks)\n",
    "    newly_retrieved_context = '\\n\\n'.join([doc.page_content for doc in chunks])\n",
    "    previously_retrieved_useful_information = state[\"useful_information\"]\n",
    "    \n",
    "    combined_context = f\"{previously_retrieved_useful_information}\\n{newly_retrieved_context}\"\n",
    "    # print(\"newly retrieved context:\", newly_retrieved_context)\n",
    "    \n",
    "    return {\"retrieved_context\": combined_context, 'n_round': state.get('n_round', 0) + 1}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "5660fcfd-ab9b-401a-9d25-4199b7c880d4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.714360Z",
     "iopub.status.busy": "2025-03-08T16:28:52.714219Z",
     "iopub.status.idle": "2025-03-08T16:28:52.721449Z",
     "shell.execute_reply": "2025-03-08T16:28:52.720931Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.714346Z"
    }
   },
   "outputs": [],
   "source": [
    "def decide_route(state: RAGState):\n",
    "    return state[\"router_decision\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "ba298d6c-8511-46ff-9fa3-5da0c69cf3d5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.722192Z",
     "iopub.status.busy": "2025-03-08T16:28:52.722021Z",
     "iopub.status.idle": "2025-03-08T16:28:52.731892Z",
     "shell.execute_reply": "2025-03-08T16:28:52.731284Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.722175Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<langgraph.graph.state.StateGraph at 0x7ff80d7c55d0>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "workflow = StateGraph(RAGState)\n",
    "\n",
    "workflow.add_node('retrieve context', retrieve)\n",
    "workflow.add_node('is retrieved context complete?', validate_retrieval)\n",
    "workflow.add_node('answer', answer)\n",
    "workflow.add_node('find missing information', find_missing_information)\n",
    "\n",
    "workflow.set_entry_point('retrieve context')\n",
    "workflow.add_edge('retrieve context', 'is retrieved context complete?')\n",
    "workflow.add_conditional_edges(\n",
    "    'is retrieved context complete?',\n",
    "    decide_route,\n",
    "    {\n",
    "        'COMPLETE': 'answer',\n",
    "        'INCOMPLETE': 'find missing information'\n",
    "    }\n",
    ")\n",
    "workflow.add_edge('find missing information', 'is retrieved context complete?')\n",
    "workflow.add_edge('answer', END)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "20ad849c-8d30-4e75-936b-cecdcddb1415",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.732745Z",
     "iopub.status.busy": "2025-03-08T16:28:52.732553Z",
     "iopub.status.idle": "2025-03-08T16:28:52.738153Z",
     "shell.execute_reply": "2025-03-08T16:28:52.737523Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.732726Z"
    }
   },
   "outputs": [],
   "source": [
    "compiled_graph = workflow.compile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "4ae384fb-d3e4-46c4-8931-b84daa79c385",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.739158Z",
     "iopub.status.busy": "2025-03-08T16:28:52.738777Z",
     "iopub.status.idle": "2025-03-08T16:28:52.839417Z",
     "shell.execute_reply": "2025-03-08T16:28:52.838956Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.739139Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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32gMmj7dPW2ab+JEZGcjPFzsEmkANTaiuBh79qCwUF5YKG9s9KhUigkTxk2bNnvq1Klz5sxJSEgQu0aiC4yxN/yZTKYvvvhi27at//3vR5WVtaGhigkTZLm5ntxczJqF1FSx66NBo7YWe/eioAD5+eo9ezxOpy89PXnevEXz5s1bsGBBOP8momGBsTc8+Xy+7du3f/TRR1u3/qe4+KBCIZs6VTl/vmv+fEyZcoYLt4lO096O7duxbRu2blWVlLiVSsW0aZPmz//h1VdfnZOTI3Z1ROePsTeseL3er7/+esOGDe+9t76+vjkrS71ggWvePFx2GbRasYujIauhAZ99hq1bZVu3qmpqXBkZxsWLl15//fUTJkwQuzSic8bYGyZ27NixZs2aTZvebWxsyc5WL17sWrwYo0eLXRYNL34/du3Chg3YsEFVVeUeMSJ58eKlt95666hRo8Qujai/GHtDW3t7+9q1a9944+V9+0rHj1ddf7178WJkZopd1vm68068/TYAlJdj5Eixq6Gz8/uxZw82bMA776iqqjw/+MHse+65/6qrrlJyBzoNenzw0FBVWVm5atWqxMS4++//WXb2d7t2oajI/cgjQzjzaAiRyTB5Mp5/HkePurds8QcFfb148Y/T05OfffbZlpYWsasj6pWfhhqTybRq1aqgIFVqqur559HUBL9/UA833wwAmzf33dLrhdsNt1v8mgfhwhkM3fYyHD2Khx6CwaDS67W/+93vOjo6xP5FITozbu0NJR0dHatXrx45MnXt2ldffNFdVub+1a8QFSV2Wb1qaMC77/a3sVwOpVJCJ5qe08IRvdvepadj9WocO+ZeudL6xBO/zspKW7t2rc93hqcvEYlM7Nyl/iopKbnkkqzQUMX/+39oaxvojZLFiwFArYbdjiVLoNXiD38QfmQyYdUqjBgBtRp6Pa64AoWFwo9mzz79+xbY/jhbb3fcITQrL+/66F76nzVLaF9R0dXe4RAes5eR0XcPZxva2vDooxg1CkFB0Okwfz4+//yUBk4nXnwRkyZBo0FQEEaMwMqVOH78DEvM78dbb2HUKKjVSE/H66/3sXB6L7gzz376067P+tWvhImvv95btwM2NDbi/vvlSqV87txZx48fF/tXh+gUjL2h4W9/+5tarZw7V1ldPdCrsMCwYoWwDv31r4WRp5+G34+mJowYIazf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E86fPy8Sido6B4Q6DcZeJ1EqlS+++OKaNWvsq+aysjKLxdLySrCkpAQAvL29776LyWRKpVLrBFbJycmLFy9OT0+PiYkBgJ9//jk5ObmFmZeVlX3++efXrl17//33W/MSbt68OX78+EYjT506ZX26jn54yzZs2PD2229XVlbSaLSWpyQI4rPPPhs+fPj8+fNjY2Mb3oVLpE0Pb4TD4ezZsycuLm7WrFl79uy554JAiCwYe51Bp9ONHz8+Ly9PrVbbRzKZTAAwm80tPNA6jaWZs8PNZjNB1O+m7tOnz5AhQ3bs2BETE3P79u2zZ8/u2LEjLS2t4UMuX77ccH3k6uq6efPmqVOntuZVREREXLp0qTVTdsTDWxYfH19dXX316tW+ffvec+KhQ4dOnjx50aJFjS6XxCVynzw8PHbv3p2UlLRq1Sr7PmGEuho8ttcZNBqNUCj8+++/AwMD7SOlUilBEDk5OS08sHfv3gCQl5d39116vb6srKxPnz4NRz7xxBM7d+60WCy7du0aMGCAl5dXo0cFBwen31FUVFRRUeEcZ9/FxMTMnz/fmkmt8fHHH6elpTW6mAGXyP1LTEz85JNPVqxYceDAAbJrQahpGHudoUePHvv27QsLC2s4ksvlDhgwYPfu3c1tOgCAq6trVFTUnj177r7r8OHDer3eelqg3aOPPlpWVnb27Nldu3Y1uT+Nw+FE3+Hl5eU0e6LodPq6deuCg4NbOb2/v/9LL720ePFi6/VzVrhEHGLBggVPPPHEk08+efv2bbJrQagJGHtkevnll7OystasWdNwpMFgmDZtmv2kiUWLFp06darR9VUKheKNN96Ij48fMmRIw/E9e/YcNWrUjz/++O+//zY61RA1smzZMo1Gs2HDhoYjcYk4xMaNG93c3GbMmGEymciuBaHG8NgemR599NH58+cvWbIkPT398ccfF4lE2dnZGzduLC4utu8jmj179qlTp55++ulTp05NnjyZz+dnZWV9+umnBoPht99+a3gkyWr69Olz584dOnSou7t7O0rSarWpqakNxwQEBFj7FL37LgCg0Wj9+/dv35zb9HCHEwqF77333quvvtpwJC4RhywRHo+3a9euhISEDz74ABtwQV0OeZcMIptdu3YNHz68Z8+eLi4u9qawGk2zY8eOYcOGubq6cjickJCQN998s6Kiwn7vpEmTZsyYYb2tVqu5XO63335r/feXX36B5i+ObmTSpEl3f0Ks1243eRcA0On0RjNp7uLoVj7csRpdrm5/l6yMRqO14RX75epWuEQc4ssvvyQIIiUlxVEzRMghsAcGhFCHsFgsU6ZMuXTpUkZGhlAoJLschGzw2F6HaKEdEIQownoNu06nW7RoEdm1IFQPj+053vr1699+++3+/fu33GjIypUrf/rpp06rqitbvnz59OnTHTW32traW7duKRSKWbNmOWqelJKQkLBlyxaHzMrV1fXrr7+eNGnS+PHjp0yZ4pB5InSfcCeng5nN5sGDB48ePdreJFVz0tPTc3NzO6eqLi42NjYgIMBRc3vhhRdSUlKOHj165swZR82TUtzc3JKSkhw4w9mzZx88eDAzM9PNzc2Bs0WofTD2HE+n0zGZzLvP6EOdo6CgICwsbNWqVbhvrYuQy+WRkZFDhw798ccfya4FIYw95Iz27duXmJjo6upKdiHI5sCBA+PGjfv7779HjBhBdi2I6jD2EEKdYerUqZmZmZmZmfb+7hEiBe6IQwh1hvXr11dWVq5evZrsQhDVYewhhDqDVCp95513Pvzww2vXrpFdC6I03MnpAEajkcHAS0EQugeTyZSQkMDn848fP+4EjW6jbgq39u7X0aNHw8LCqqqqyC4Eoa6OTqd//fXXp0+f3rZtG9m1IOrC2LsvCoXi6aef7tu3L5402JXdvHnz5MmTZFeBAAD69ev3/PPPv/LKK/hLEZEFY+9+jR8//ttvvyW7CtSSjz/+eOrUqUVFRWQXggAAVq1axWazlyxZQnYhiKLw2B5yfhqNJjExccSIEZ999hnZtSAAgJ07d86YMePixYvR0dFk14IoB2MPUUJxcbG7uzueedRFWCyWIUOGMJnMY8eOkV0LohyMPYQQCVJTUwcOHLh3796HH36Y7FoQtWDsIYTIMW3atCtXrmRmZuJWOOpMeEoLQogca9asuXnz5qZNm8guBFELbu21mUaj4fF4ZFeBkDNYtGjR9u3bc3Nzsft11Glwa69trl275u3tnZ6eTnYh6H7dunUL+zsk3fLly81m85o1a8guBFEIbu21gcViGTFihFKpTE1NpdPpZJeD7svUqVPT09NPnjzp5eVFdi2U9sknnyxbtiw7O9vb25vsWhAlYOy1gclk+vzzz4cPHx4bG0t2Leh+VVdXDx8+PD4+fvPmzWTXQmk6nS4sLCwpKem7774juxZECRh7iLqqqqp4PB6HwyG7EKrbunXr008/ffXq1eDgYLJrQc4PYw8hRDKTydS3b9/ExMQffviB7FqQ88NTWhBCJKPT6UuXLv3xxx+zs7PJrgU5P9zaQwiRz2QyhYeHJyQkbNmyhexakJPDrT2E/sNkMpFdAhXR6fRly5Zt374dN/hQR8PYQ6ieQqGIi4v7/vvvyS6EipKTk4OCgt5//32yC0FODmPvHr788svnn3+e7CpQJxEKhePGjZs7dy6eW9H56HT622+/vWPHjuvXr5NdC3JmeGyvJUqlMjAwcM6cOR999BHZtaDO88svv4waNUokEpFdCOWYTKaIiIiYmJjt27eTXQtyWhh7LcnMzJw3b97+/fslEgnZtSBECT/99NOsWbNu3Ljh7+9Pdi3IOWHsIYS6EJPJFBISMmbMmHXr1pFdC3JOeGwPIdSF0On0hQsXfv/995WVlWTXgpwTxh5CrVJUVFRdXU12FZQwd+5cLpe7fv16sgtBzgljD6FWefnll6Ojo0+ePEl2Ic6Py+U+//zzX375pUajIbsW5ITw2B5CrSKTyebOnatSqf7++2+ya3F+FRUVvr6+H3/88fz588muBTkbjD2E2kCtVvP5fLKroIQXXnjh4MGDN27cYDAYZNeCnAru5GwsKyvr/PnzZFeBuijMvE7z2muvFRUV/fbbb2QXgpwNbu019vDDD1dXV6emppJdCEJUN23atFu3buGXETkW1bf2du/eXVVVZf83IyNj//79K1asILEk1O1cuXJFp9ORXYUTWrhwYVpa2rlz58guBDkVqm/thYeH5+bmPvvss6+88oqfnx8AnD59etCgQWTXhboNs9kcEhJCp9M3bNgwfPhwsstxNv369QsLC9u6dSvZhSDnQfWtvZKSEp1O9/XXXwcGBj722GPp6emYeahNCII4ceJERETEvn37yK7FCT3//PM///xzeXk52YUg50HprT2j0chisezvAJPJNBgM/fv3X7p06fjx42k0Grnloe7FaDTiOYcOV1tb6+XltWjRoqVLl5JdC3ISlN7aq6ioaJj6BoMBAC5cuDBx4sTIyMidO3cajUbyqkPdDGZeR+BwOE8//fRXX31l/XoidP8oHXulpaV3j7R2rp2VlbVgwYK8vLxOLwoh9B/z588vLy//888/yS4E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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import Image, display\n",
    "\n",
    "# display(Image(compiled_graph.get_graph(xray=True).draw_mermaid_png()))\n",
    "draw_graph = compiled_graph.get_graph(xray=True)\n",
    "display(Image(draw_graph.draw_png()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "d2397a98-bc5e-4e7c-b793-9579eca859db",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.840161Z",
     "iopub.status.busy": "2025-03-08T16:28:52.839892Z",
     "iopub.status.idle": "2025-03-08T16:28:52.847688Z",
     "shell.execute_reply": "2025-03-08T16:28:52.847200Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.840147Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uuid</th>\n",
       "      <th>question</th>\n",
       "      <th>answer</th>\n",
       "      <th>context</th>\n",
       "      <th>doc</th>\n",
       "      <th>qa_type</th>\n",
       "      <th>score</th>\n",
       "      <th>score_reason</th>\n",
       "      <th>dataset</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>324</th>\n",
       "      <td>ecc12483-d88f-41af-93a6-16c48d4ef147</td>\n",
       "      <td>商业房地产贷款在中小型银行资产中的占比大约是多少？</td>\n",
       "      <td>29%</td>\n",
       "      <td>该类贷款在中小银行资产中占比达29%，高于大型银行的6.4%，风险敞口更集中。</td>\n",
       "      <td>全球经济金融展望报告\\n中国银行研究院 48 2024年\\n该类贷款新发放量将同比下降46%...</td>\n",
       "      <td>detailed</td>\n",
       "      <td>5</td>\n",
       "      <td>问题询问的是具体的数据，是实证性的信息；答案直接给出了数值，符合要求。</td>\n",
       "      <td>test</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>275</th>\n",
       "      <td>c6fc6079-0daf-4d6a-bd6e-7d9820012425</td>\n",
       "      <td>沙特的全面绿色倡议包含哪些项目？</td>\n",
       "      <td>13个可再生能源项目</td>\n",
       "      <td>沙特绿色倡议包括13个可再生能源项目，计划每年减少约2000万吨碳排放。</td>\n",
       "      <td>全球经济金融展望报告\\n中国银行研究院 42 2024年\\n供了空间，进一步坚定了海湾六国经...</td>\n",
       "      <td>detailed</td>\n",
       "      <td>4</td>\n",
       "      <td>问题询问的是具体的项目内容，答案直接给出了明确的回应，没有简单地引用原文或做概括性描述。虽然...</td>\n",
       "      <td>test</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>128</th>\n",
       "      <td>733c7f0b-06fd-40f4-a1de-0c863db6069a</td>\n",
       "      <td>日本通胀同比增速变化的数据来源是哪里？</td>\n",
       "      <td>Wind，中国银行研究院</td>\n",
       "      <td>图12：日本通胀同比增速变化（%）\\n资料来源：Wind，中国银行研究院</td>\n",
       "      <td>全球经济金融展望报告\\n中国银行研究院 18 2024年\\n图12：日本通胀同比增速变化（%...</td>\n",
       "      <td>detailed</td>\n",
       "      <td>5</td>\n",
       "      <td>问题询问的是具体数据来源，答案直接提供了来源机构，符合要求。</td>\n",
       "      <td>train</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                     uuid                   question  \\\n",
       "324  ecc12483-d88f-41af-93a6-16c48d4ef147  商业房地产贷款在中小型银行资产中的占比大约是多少？   \n",
       "275  c6fc6079-0daf-4d6a-bd6e-7d9820012425           沙特的全面绿色倡议包含哪些项目？   \n",
       "128  733c7f0b-06fd-40f4-a1de-0c863db6069a        日本通胀同比增速变化的数据来源是哪里？   \n",
       "\n",
       "           answer                                  context  \\\n",
       "324           29%  该类贷款在中小银行资产中占比达29%，高于大型银行的6.4%，风险敞口更集中。   \n",
       "275    13个可再生能源项目     沙特绿色倡议包括13个可再生能源项目，计划每年减少约2000万吨碳排放。   \n",
       "128  Wind，中国银行研究院     图12：日本通胀同比增速变化（%）\\n资料来源：Wind，中国银行研究院   \n",
       "\n",
       "                                                   doc   qa_type  score  \\\n",
       "324  全球经济金融展望报告\\n中国银行研究院 48 2024年\\n该类贷款新发放量将同比下降46%...  detailed      5   \n",
       "275  全球经济金融展望报告\\n中国银行研究院 42 2024年\\n供了空间，进一步坚定了海湾六国经...  detailed      4   \n",
       "128  全球经济金融展望报告\\n中国银行研究院 18 2024年\\n图12：日本通胀同比增速变化（%...  detailed      5   \n",
       "\n",
       "                                          score_reason dataset  \n",
       "324                问题询问的是具体的数据，是实证性的信息；答案直接给出了数值，符合要求。    test  \n",
       "275  问题询问的是具体的项目内容，答案直接给出了明确的回应，没有简单地引用原文或做概括性描述。虽然...    test  \n",
       "128                     问题询问的是具体数据来源，答案直接提供了来源机构，符合要求。   train  "
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qa_df.sample(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "a21195ad-1e2a-4b9b-87d1-08152ba111bc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.848252Z",
     "iopub.status.busy": "2025-03-08T16:28:52.848120Z",
     "iopub.status.idle": "2025-03-08T16:28:52.850299Z",
     "shell.execute_reply": "2025-03-08T16:28:52.849964Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.848239Z"
    }
   },
   "outputs": [],
   "source": [
    "# result = compiled_graph.invoke({'question': '全球贸易增长情况如何？'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "8322f0e7-4b96-4b89-81ac-b77fd23c66c5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.850828Z",
     "iopub.status.busy": "2025-03-08T16:28:52.850702Z",
     "iopub.status.idle": "2025-03-08T16:28:52.857174Z",
     "shell.execute_reply": "2025-03-08T16:28:52.856723Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.850816Z"
    }
   },
   "outputs": [],
   "source": [
    "# result['answer_to_question']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ebd6891-663f-4e7f-b3cc-e216e5200407",
   "metadata": {},
   "source": [
    "# 批量预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "7c74cb81-b40b-4879-a21c-119c69da291f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.857703Z",
     "iopub.status.busy": "2025-03-08T16:28:52.857578Z",
     "iopub.status.idle": "2025-03-08T16:28:52.863721Z",
     "shell.execute_reply": "2025-03-08T16:28:52.863328Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.857690Z"
    }
   },
   "outputs": [],
   "source": [
    "test_df = qa_df[(qa_df['dataset'] == 'test') & (qa_df['qa_type'] == 'detailed')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "bb499307-2063-4c45-bb48-3964d0a13a0c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.864272Z",
     "iopub.status.busy": "2025-03-08T16:28:52.864143Z",
     "iopub.status.idle": "2025-03-08T16:28:52.878621Z",
     "shell.execute_reply": "2025-03-08T16:28:52.876435Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.864260Z"
    }
   },
   "outputs": [],
   "source": [
    "prediction_df = qa_df[qa_df['dataset'] == 'test'][['uuid', 'question', 'qa_type', 'answer']].rename(columns={'answer': 'ref_answer'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "eecff687-e417-4161-8200-9e36c518a73e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.882070Z",
     "iopub.status.busy": "2025-03-08T16:28:52.881285Z",
     "iopub.status.idle": "2025-03-08T16:28:52.890887Z",
     "shell.execute_reply": "2025-03-08T16:28:52.888597Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.881996Z"
    }
   },
   "outputs": [],
   "source": [
    "# prediction_df = baseline_pred_df[baseline_pred_df['score'] == 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "b30a1f1f-dfbd-4252-bf19-fdee018ca525",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.893818Z",
     "iopub.status.busy": "2025-03-08T16:28:52.893105Z",
     "iopub.status.idle": "2025-03-08T16:28:52.907295Z",
     "shell.execute_reply": "2025-03-08T16:28:52.905030Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.893749Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 4)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "fa03ecaa-3f88-465a-b33e-5d8d0379e4a0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.910738Z",
     "iopub.status.busy": "2025-03-08T16:28:52.910011Z",
     "iopub.status.idle": "2025-03-08T16:28:52.936778Z",
     "shell.execute_reply": "2025-03-08T16:28:52.934267Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.910669Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uuid</th>\n",
       "      <th>question</th>\n",
       "      <th>qa_type</th>\n",
       "      <th>ref_answer</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>265</th>\n",
       "      <td>28c7d4f0-8cea-48b3-9cfa-6683446fd425</td>\n",
       "      <td>海湾六国经济结构的主要问题是什么？</td>\n",
       "      <td>detailed</td>\n",
       "      <td>经济结构相对单一</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>247</th>\n",
       "      <td>8cd339ad-8db5-4fa8-adb4-90112436bc6f</td>\n",
       "      <td>11月16日NYMEX天然气的价格是多少？</td>\n",
       "      <td>detailed</td>\n",
       "      <td>3.1美元/百万英热</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>311</th>\n",
       "      <td>c47057d6-35c0-4466-bafd-4ed036030c1d</td>\n",
       "      <td>在2024年美联储可能做什么？</td>\n",
       "      <td>detailed</td>\n",
       "      <td>开始降息</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>314</th>\n",
       "      <td>c47057d6-35c0-4466-bafd-4ed036030c1d</td>\n",
       "      <td>疫情后美国商业房地产价格在2021年四季度的季度同比增幅是多少？</td>\n",
       "      <td>detailed</td>\n",
       "      <td>16.4%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>211</th>\n",
       "      <td>65b167b2-bf81-4148-b6a6-7afb9946676d</td>\n",
       "      <td>市场对美联储的预期是什么？</td>\n",
       "      <td>detailed</td>\n",
       "      <td>降息</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                     uuid                          question  \\\n",
       "265  28c7d4f0-8cea-48b3-9cfa-6683446fd425                 海湾六国经济结构的主要问题是什么？   \n",
       "247  8cd339ad-8db5-4fa8-adb4-90112436bc6f             11月16日NYMEX天然气的价格是多少？   \n",
       "311  c47057d6-35c0-4466-bafd-4ed036030c1d                   在2024年美联储可能做什么？   \n",
       "314  c47057d6-35c0-4466-bafd-4ed036030c1d  疫情后美国商业房地产价格在2021年四季度的季度同比增幅是多少？   \n",
       "211  65b167b2-bf81-4148-b6a6-7afb9946676d                     市场对美联储的预期是什么？   \n",
       "\n",
       "      qa_type  ref_answer  \n",
       "265  detailed    经济结构相对单一  \n",
       "247  detailed  3.1美元/百万英热  \n",
       "311  detailed        开始降息  \n",
       "314  detailed       16.4%  \n",
       "211  detailed          降息  "
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df.sample(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "9ea63a5c-9a74-4d27-b0b2-102f515c336e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.940152Z",
     "iopub.status.busy": "2025-03-08T16:28:52.939437Z",
     "iopub.status.idle": "2025-03-08T16:28:52.955462Z",
     "shell.execute_reply": "2025-03-08T16:28:52.953188Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.940084Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 0)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "if 'finished_questions' in locals():\n",
    "    finished_questions = locals()['finished_questions']\n",
    "else:\n",
    "    finished_questions = set()\n",
    "    answer_dict = {}\n",
    "\n",
    "len(finished_questions), len(answer_dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "7e86b24f-d5a9-4616-8ace-b4424330a4fc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.958937Z",
     "iopub.status.busy": "2025-03-08T16:28:52.958199Z",
     "iopub.status.idle": "2025-03-08T16:28:52.978049Z",
     "shell.execute_reply": "2025-03-08T16:28:52.975791Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.958867Z"
    }
   },
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "def rag(llm, query, n_chunks=3):\n",
    "    prompt_tmpl = \"\"\"\n",
    "你是一个金融分析师，擅长根据所获取的信息片段，对问题进行分析和推理。\n",
    "你的任务是根据所获取的信息片段（<<<<context>>><<<</context>>>之间的内容）回答问题。\n",
    "回答保持简洁，不必重复问题，不要添加描述性解释和与答案无关的任何内容。\n",
    "已知信息：\n",
    "<<<<context>>>\n",
    "{{knowledge}}\n",
    "<<<</context>>>\n",
    "\n",
    "问题：{{query}}\n",
    "请回答：\n",
    "\"\"\".strip()\n",
    "    chunks = vector_db.similarity_search(query, k=n_chunks)\n",
    "    prompt = prompt_tmpl.replace('{{knowledge}}', '\\n\\n'.join([doc.page_content for doc in chunks])).replace('{{query}}', query)\n",
    "    retry_count = 3\n",
    "\n",
    "    resp = ''\n",
    "    while retry_count > 0:\n",
    "        try:\n",
    "            resp = llm.invoke(prompt).content.strip()\n",
    "            if resp.startswith('<think>'):\n",
    "                resp = resp.split('</think>')[1]\n",
    "            break\n",
    "        except Exception as e:\n",
    "            retry_count -= 1\n",
    "            sleeping_seconds = 2 ** (4 - retry_count)\n",
    "            print(f\"query={query}, error={e}, sleeping={sleeping_seconds}, remaining retry count={retry_count}\")\n",
    "            \n",
    "            time.sleep(sleeping_seconds)\n",
    "    \n",
    "    return resp, chunks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "02ab765a-2ec1-4f57-a4b2-17ea74f68baa",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T16:28:52.981405Z",
     "iopub.status.busy": "2025-03-08T16:28:52.980683Z",
     "iopub.status.idle": "2025-03-08T18:05:25.316197Z",
     "shell.execute_reply": "2025-03-08T18:05:25.315848Z",
     "shell.execute_reply.started": "2025-03-08T16:28:52.981336Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b5c5b00b66cb4dc0b100f4363232feed",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/100 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 报告的发布机构是什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '中国银行研究院', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 中国银行研究院\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 报告的发布日期是什么时候？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '报告日期：2023年12月12日', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 报告的发布日期是2023年12月12日。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球经济增长有什么特点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年全球经济呈现复苏不均衡特点：发达经济体增速放缓（欧元区、英国转负增长，美国超预期增长4.9%），新兴经济体增速持平但区域分化（东南亚、拉美增长承压，中东欧加速）。全球贸易投资下行，货物贸易量价指数双降，跨境直接投资降幅收窄。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球经济复苏不均衡，各区域存在较大差异。发达经济体增速放缓，预计全年增长较2022年下降1个百分点。欧元区和英国经济大幅下降；美国表现相对较好。新兴经济体增速大致持平，但东南亚等出口型经济体及拉美、非洲等大宗商品出口国的增长承压。\n",
      "\n",
      "2024年全球经济主线逻辑为“复苏+分化”，预计全年经济增速在2.5%左右，较2023年低0.2个百分点。\n",
      "\n",
      "美国经济方面，在未受明显加息冲击的情况下出现超预期增长。私人消费和政府财政支出成为经济增长的重要驱动力。就业市场稳健，失业率低于历史平均水平，劳动者实际收入保持增长。财政支出对经济增长的带动作用增强。制造业投资稳定增长，一定程度上抵消了利率提升对房地产投资的影响。净出口拖累效应减弱。\n",
      "\n",
      "2023年全球跨境直接投资继续下行，但降幅较前一年收窄。国际贸易中，全球货物贸易量和价格指数均承压下行，主要经济体出口贸易同比增速下降。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球贸易增长情况如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年全球货物贸易增速预测下调至0.8%，为近几年最低水平，但东亚、东南亚部分经济体如越南和韩国在9-10月出现出口正增长，显示企稳迹象。', 'missing_information': '2023年全球服务贸易增长数据、其他主要地区如欧洲或美洲的具体贸易增长情况'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球货物贸易量和价格指数均承压下行，主要经济体出口贸易同比增速下降。预计2023年国际贸易增长为近几年最低水平。但近期东亚、东南亚等主要经济体出口下滑趋势有所收窄，显示出企稳迹象。10月越南出口结束连续10个月的负增长，实现正增长；韩国9-10月出口也实现了自2022年以来首次正增长。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 展望2024年，全球经济复苏的预期如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年全球经济复苏预计依旧疲软且分化加剧。发达经济体面临通胀与增长两难，货币政策将分化；各国经济差异扩大，美国可能软着陆而欧元区疲弱；需求端压力大于生产端，但供应链恢复、通胀回落、流动性缓解及中国与亚太经济体复苏将形成托底支撑。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年全球经济复苏预计将较为疲软，并且可能加剧分化。发达经济体面临“遏通胀和稳增长”的两难局面，货币政策走势将出现分化。新兴市场和发展中经济体将面临更大的经济增长压力。\n",
      "\n",
      "- 发达经济体：核心通胀黏性较强，通胀回落速度较慢，导致多数国家的通胀率高于央行目标。预计在一段时期内政策利率将维持高位。然而，随着经济下行压力加大，主要经济体央行的货币政策走势可能逐渐分化。\n",
      "  \n",
      "- 各国经济走势将进一步分化：相较于新兴市场和发展中经济体，发达经济体面临更大的经济增长压力。欧元区和英国面临较大的通胀压力，但随着增长压力加大，货币政策可能在2024年上半年转向。美国经济处于下行阶段，面临“软着陆”或衰退的风险，目前看，“软着陆”的可能性更大。\n",
      "\n",
      "- 需求端与生产端：2023年全球工业生产在触底后缓慢回升，预计2024年全球供应链和工业生产将继续波动中复苏。然而，在高通胀、高利率及高债务的影响下，居民家庭资产负债表状况将逐渐变差，这可能导致对需求端的紧缩性货币政策产生滞后影响，进而支撑经济增长的需求因素面临加速回落的压力。\n",
      "\n",
      "- 稳定因素：随着供应链恢复正常和全球供求形势持续改善，尽管存在顽固通胀，但整体回落趋势不会逆转。主要经济体加息周期预计会逐步停止甚至转向，缓解全球流动性紧缩情况。此外，在全球产业链重组背景下，流向新兴经济体的跨境直接投资和证券投资预计将有所回升。\n",
      "\n",
      "- 地区性经济展望：中国经济复苏动力增强，亚太等出口型经济体增长逐渐企稳，这将为全球经济复苏提供重要支撑。随着宏观政策效应释放，中国经济呈稳定复苏态势，带动相关经贸伙伴贸易回暖，并叠加半导体产业复苏周期的推动作用，韩国、越南等亚太地区出口导向型经济体的表现有望有所好转。\n",
      "\n",
      "综上所述，2024年全球经济增长预期疲软且分化加剧，但存在一些积极因素减缓经济下行幅度。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 哪些热点问题在报告中被提及？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': \"绿色转型与能源安全、'南南合作'深化、人民币国际化、美国房地产市场脆弱性、发展中国家货币合作与新兴产业合作（绿色化/数字化/智能化）、国际治理体系变革\", 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 报告中提及的热点问题包括：\n",
      "\n",
      "1. 绿色转型与能源安全对中东地区经济多元化发展的影响，以及沙特阿拉伯、阿联酋和科威特等国家转向可再生能源发展的趋势。\n",
      "2. 中东新兴经济体制定能源转型战略，投资领域从传统能源拓展至人工智能、大数据、新能源、医疗等新兴产业，以推动可持续增长。\n",
      "3. \"南南合作\"的深化与国际合作新框架的发展，特别是在中国-中亚峰会、金砖国家领导人会晤和“一带一路”国际合作高峰论坛上的共识达成，为新兴经济体提供合作平台。\n",
      "4. 中海（中国与海湾六国）深化经贸合作将为人民币国际化搭建新的平台，并通过双边经贸依托推动人民币在中东地区的使用以及货币领域的合作。\n",
      "5. 高利率、高债务对美国房地产市场的脆弱性，特别是居住房地产市场的需求上升和潜在风险的增加。\n",
      "\n",
      "这些热点问题反映了全球经济金融领域中的多方面趋势与挑战。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 如何联系报告的研究小组？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '联系人：王有鑫，电话：010-66594127，邮件：wangyouxin_hq@bank-of-china.com', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 联系人：王有鑫  \n",
      "电话：010-66594127  \n",
      "邮件：wangyouxin_hq@bank-of-china.com\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球经济增长动力如何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年全球经济增长动力呈现明显分化：美国主要由私人消费（贡献率64.4%）和政府财政支出（23.5%）驱动，制造业投资对冲利率影响，房地产投资反弹；欧元区和英国经济增速逐季下滑（三季度环比-0.1%和0%），受高利率和出口疲软拖累；新兴经济体整体持平但区域差异显著，东南亚出口型经济体承压，中东欧增速加快。', 'missing_information': '2023年亚洲主要经济体（除东南亚外）、非洲及拉美主要国家的具体增长动力数据；全球贸易总量变化对增长的影响系数；中国在2023年全球经济动力中的具体贡献数据。'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球经济增长动力不均衡。发达经济体增速放缓，预计增速比2022年下降1个百分点；新兴经济体增长与2022年大致持平，但面临出口压力，部分大宗商品出口国和东南亚出口型经济体增长承压。全球经济复苏存在明显差异，表现为发达国家经济疲软、新兴市场国家增长相对稳定但仍受外部环境影响。\n",
      "\n",
      "具体到美国，经济未受加息显著冲击，出现超预期增长，但私人消费和政府财政支出是主要驱动力；服务领域需求释放，就业市场稳健，劳动者实际收入保持增长，家庭财务状况良好。然而，2024年美国经济增速预计将降至1.7%，较2023年下降0.7个百分点。\n",
      "\n",
      "欧洲方面，经济增长动能不足，表现为在高通胀、货币政策收紧和疫情后效应等因素影响下，欧元区和英国经济活动停滞或放缓，PMI指数下滑至新低点。预计2024年欧洲经济增长仍将继续疲软，特别是上半年的表现会受到抑制。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 发达经济体在2023年的增速变化如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '发达经济体2023年增速较2022年下降1个百分点，欧元区三季度GDP环比降0.1%，英国降0.03%，美国三季度环比增长折年率4.9%且高于二季度增速2.8个百分点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年，发达经济体的GDP增速较2022年下降了1个百分点。其中，欧元区和英国经济增速大幅下降，分别从之前的正增长转为负增长；美国表现好于其他发达经济体，但GDP环比增长折年率也有所提升，比二季度增速高2.8个百分点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球供应链恢复情况如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球供应链持续恢复，纽约联储全球供应链压力指数于2023年10月降至历史最低值；但生产景气度回落，全球制造业PMI从2月49.9%降至10月48.8%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 截至2023年10月底，全球供应链持续恢复，纽约联储全球供应链压力指数降至有记录以来的最低值。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年美元指数的整体走势如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年美元指数始终在100-105区间高位波动，7月初震荡走高后逐渐回落，11月15日达104.4较年初上涨0.6%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年以来，美元指数始终保持高位，在100-105区间波动，7月初开始震荡走高，之后逐渐从高位回落。截至2023年11月15日，美元指数为104.4，较年初上涨0.6%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球经济复苏呈现什么特点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球经济复苏呈现不均衡特点：1.发达经济体增速分化明显（美国增长强劲，欧元区/英国负增长）；2.新兴经济体内部差异大（东南亚/拉美承压，中东欧加快）；3.生产端供应链恢复但景气回落，制造业PMI持续下降；4.需求端内需拉动作用减弱（美国消费贡献下降，全球服务业PMI连续5个月下行）。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球经济复苏不均衡，发达经济体增速明显放缓，新兴经济体增速与2022年大致持平。其中，欧元区和英国经济增速大幅下降，美国表现好于其他发达经济体；东南亚等出口型经济体增长承压，拉美、非洲等大宗商品出口国增速放缓，中东欧国家经济增速加快。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年三季度欧元区GDP环比增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年三季度欧元区GDP环比增速下降0.1%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年三季度欧元区GDP环比增速为-0.1%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年三季度英国GDP环比增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年三季度英国GDP环比增速为-0.03%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年三季度美国GDP环比增长折年率是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年三季度美国GDP环比增长折年率为4.9%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年三季度美国GDP环比增长折年率为4.9%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 哪些地区在2023年预计经济增速加快？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '中东欧国家经济增速加快。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 中东欧国家经济增速加快。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球供应链压力指数降至有记录以来最低值的时间点是什么时候？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '截至2023年10月底，纽约联储全球供应链压力指数降至有记录以来的最低值。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球供应链压力指数降至有记录以来最低值的时间点为2023年10月底。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球工业生产量何时触及年内低位？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球工业生产量于4月触及年内低位', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年4月\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球制造业PMI指数从什么值降至什么值？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球制造业PMI指数从2月的49.9%降至10月的48.8%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球制造业PMI指数从2月的49.9%降至10月的48.8%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年的全球经济金融展望报告是由哪个机构发布的？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '中国银行研究院', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球经济增长动力持续回落，各国复苏分化，发达经济体增速放缓，新兴经济体整体表现稳定。全球贸易增长乏力，各国生产景气度逐渐回落，内需对经济的拉动作用减弱。欧美央行货币政策紧缩态势放缓，美元指数高位震荡后走弱，全球股市表现总体好于预期，但区域分化明显。高利率环境抑制债券融资需求，债券违约风险持续上升。\n",
      "\n",
      "展望2024年，预计全球经济复苏将依旧疲软，主要经济体增长态势和货币政策走势将进一步分化。欧美央行大概率结束本轮紧缩货币周期，美元指数将逐步走弱，流向新兴经济体的跨境资本将增加。国际原油市场短缺格局或延续，新能源发展成为重点。\n",
      "\n",
      "中国银行研究院团队对2024年全球经济金融进行展望，重点关注海湾六国经济发展与投资前景、高利率和高债务对美国房地产市场的脆弱性影响等热点问题。报告中提到的主要经济体GDP增速变化趋势数据来源于国际货币基金组织（IMF）。\n",
      "\n",
      "综上所述，这份全球经济增长动力报告是由中国银行研究院发布的。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美国零售和食品销售额10月的环比增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国零售和食品销售额10月环比增速为-0.1%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: -0.1%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球服务业PMI指数从何时开始明显回落？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球服务业PMI指数从二季度开始明显回落（从5月的55.5%降至10月的50.4%）', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球服务业PMI指数从二季度（5月）开始明显回落，至10月时降至50.4%，连续5个月下行。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球服务业PMI指数在10月份达到了多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球服务业PMI指数在10月达到50.4%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球服务业PMI指数在10月降至50.4%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年三季度美国住宅投资的情况如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国2023年三季度住宅投资恢复增长，带动私人投资增速提升至8.4%（经季调后环比折年率）。', 'missing_information': '2023年三季度美国住宅投资的具体增长率或单独统计数据'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年三季度，美国住宅投资恢复增长，存货及住宅投资带动了私人投资增速提升至8.4%（经季调后环比折年率）。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '2022年底和2023年二季度美国非金融企业部门债务率的具体数值百分比'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2022年底和2023年二季度美国非金融企业部门债务率的具体数值百分比\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5：部分发达国家非金融企业部门债务率（%）存在于背景信息中，但未提供具体数值。', 'missing_information': '2022年底和2023年二季度美国非金融企业部门负债率的具体百分比数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 2022年底和2023年二季度美国非金融企业部门负债率的具体百分比数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率但未提供具体数值', 'missing_information': '图5中2022年底和2023年二季度美国非金融企业部门债务率的具体百分比数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 图5中2022年底和2023年二季度美国非金融企业部门债务率的具体百分比数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '2022年底和2023年二季度美国非金融企业部门负债率的具体数值数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 2022年底和2023年二季度美国非金融企业部门负债率的具体数值数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率数据，但具体数值和变化未在文本中明确说明', 'missing_information': '2022年底和2023年二季度美国非金融企业部门负债率的具体百分比数值及变化差值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 5)===\n",
      "Searching for: 2022年底和2023年二季度美国非金融企业部门负债率的具体百分比数值及变化差值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 6)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率数据，但具体数值和变化未在文本中明确说明', 'missing_information': '2023年二季度与2022年底美国非金融企业部门负债率的具体数值或变化百分点数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 6)===\n",
      "Searching for: 2023年二季度与2022年底美国非金融企业部门负债率的具体数值或变化百分点数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 7)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率数据但未明确数值', 'missing_information': '2022年底和2023年二季度美国非金融企业部门债务率具体数值（需图5原始数据）'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 7)===\n",
      "Searching for: 2022年底和2023年二季度美国非金融企业部门债务率具体数值（需图5原始数据）\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 8)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率数据但未明确数值', 'missing_information': '2022年底和2023年二季度美国非金融企业部门债务率的具体百分比数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 8)===\n",
      "Searching for: 2022年底和2023年二季度美国非金融企业部门债务率的具体百分比数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 9)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率数据但未明确数值，数据来源为IIF和中国银行研究院', 'missing_information': '2022年底和2023年二季度美国非金融企业部门负债率的具体数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 9)===\n",
      "Searching for: 2022年底和2023年二季度美国非金融企业部门负债率的具体数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 10)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率数据但未明确数值，数据来源为IIF和中国银行研究院', 'missing_information': '美国非金融企业部门2022年底和2023年二季度具体债务率数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 10)===\n",
      "Searching for: 美国非金融企业部门2022年底和2023年二季度具体债务率数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 11)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率数据但未明确数值，数据来源为IIF和中国银行研究院', 'missing_information': '图5中2022年底和2023年二季度美国非金融企业部门债务率的具体数值及差值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 11)===\n",
      "Searching for: 图5中2022年底和2023年二季度美国非金融企业部门债务率的具体数值及差值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 12)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图5显示部分发达国家非金融企业部门债务率数据但未明确数值，数据来源为IIF和中国银行研究院', 'missing_information': '2023年二季度与2022年底美国非金融企业部门负债率的具体数值或变化百分比'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 12)===\n",
      "Searching for: 2023年二季度与2022年底美国非金融企业部门负债率的具体数值或变化百分比\n",
      "e: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.\n",
      "For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/GRAPH_RECURSION_LIMIT, 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: IMF预测2023年全球投资率将降至多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': 'IMF预测2023年全球投资率将下降1.0个百分点至26.4%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: IMF预测2023年全球投资率将下降1.0个百分点至26.4%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在哪些因素影响下，并购交易依然疲软？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '商业房地产处于下行周期的早期阶段且可能持续更长时间，中小型银行面临的损失可能更大；美国制造业PMI长期萎缩、企业制造业投资下降、就业市场降温、居民可支配收入承压等宏观经济疲弱因素', 'missing_information': '并购交易与商业房地产周期/银行风险之间的具体传导机制、企业并购融资环境数据、历史并购交易量趋势对比、监管政策变化对并购的影响等直接关联信息'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 并购交易与商业房地产周期/银行风险之间的具体传导机制、企业并购融资环境数据、历史并购交易量趋势对比、监管政策变化对并购的影响等直接关联信息\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '高利率、债务集中到期、贷款条件收紧、中小型银行风险敞口高、商业房地产价格下降及流动性风险上升', 'missing_information': '并购交易市场的具体数据、企业并购意愿的直接分析、并购融资渠道受阻的实例、政策对并购交易的直接影响等'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 并购交易市场的具体数据、企业并购意愿的直接分析、并购融资渠道受阻的实例、政策对并购交易的直接影响等\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '高利率、债务集中到期、贷款条件收紧、中小型银行风险敞口高、商业房地产价格下降及流动性风险上升', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 3)===\n",
      "answer: 并购交易在高利率、债务集中到期、贷款条件收紧、中小型银行风险敞口较高以及商业房地产价格下降和流动性风险上升的背景下仍然疲软。同时，经济下行和国际贸易压力也对跨境直接投资产生了抑制作用。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 图5展示的是哪个部门的债务率？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '图5展示的是部分发达国家非金融企业部门的债务率。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 图5展示的是非金融企业部门的债务率。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年前8个月全球货物贸易量指数的变化情况如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年1-8月全球货物贸易量指数震荡下行，8月数值比1月下降0.9个点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年1-8月，全球货物贸易量指数震荡下行，8月数值比1月分别下降了0.9个点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球主要经济体的出口贸易同比增速有何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年全球主要经济体出口贸易同比增速下降，荷兰经济分析局数据显示1-8月全球货物贸易量指数下降0.9个点，价格指数下降4.3个点。但越南9-10月出口同比增长5.0%和6.7%，韩国10月出口同比增长5.1%。', 'missing_information': '美国、欧元区、日本等主要经济体2023年具体出口同比增速数据'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 根据全球经济金融展望报告，2023年全球货物贸易量和价格指数均承压下行，主要经济体出口贸易同比增速下降。具体数据未直接给出，但提及荷兰经济分析局数据显示，2023年1-8月全球货物贸易量和价格指数震荡下行。此外，欧元区、英国和美国的GDP环比增速也显示经济增长放缓。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 世贸组织对2023年全球货物贸易增速的预测值是多少百分点?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '世贸组织将2023年全球货物贸易增速预测值下调0.9个百分点至0.8%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 世贸组织将2023年全球货物贸易增速预测值下调至0.8%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年国际贸易增长预计会达到什么水平?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '世贸组织将2023年全球货物贸易增速预测值下调至0.8%，为近几年最低水平。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球货物贸易增速预测值下调至0.8%，为近几年最低水平。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 哪些因素影响了欧元区和英国的经济增长？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '影响欧元区和英国经济增长的因素包括：1. 私人消费不振（零售额下降、消费者信心低迷）；2. 融资条件收紧抑制家庭借贷与投资（非建筑投资增速放缓、住房投资下降）；3. 全球市场需求减弱导致进出口疲软（欧元区出口同比下降9.4%）；4. 高通胀压力（核心通胀顽固，英国可支配收入降低3.5%）；5. 高利率和财政支持退出抑制经济；6. 劳动力市场就业增长放缓（PMI就业指数跌破荣枯线）。', 'missing_information': '英国政府应对经济放缓的具体政策措施、欧元区主要成员国产业受冲击的行业分布数据、俄乌冲突对能源供应链的持续影响程度'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球市场需求减弱、融资条件收紧抑制家庭借贷与消费支出增长，影响投资活动；高利率和高通胀持续对经济产生压力；信贷紧缩逐渐传导至实体经济。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年全球经济增速预计为多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年全球经济增速预计为2.5%（市场汇率法计算）。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 根据全球经济金融展望报告中的信息，2024年全球GDP增速预计为2.5%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年四季度美国经济增长动力如何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年四季度美国经济增长动力明显回落，GDP环比增长折年率可能回落至2%左右。私人消费疲软（零售销售环比增速降至-0.1%），制造业投资转弱（ISM制造业PMI指数下降2.3个百分点），就业市场降温（失业率升至3.9%）。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年四季度美国经济增长动力明显回落，不同部门表现分化。主要表现为：\n",
      "\n",
      "1. **私人消费减弱**：消费者支出增幅放缓，从之前两个月的0.7%以上降至-0.1%，对经济支撑作用减弱。\n",
      "2. **制造业投资和工业产出疲弱**：三季度企业制造业投资转为下降，在连续七个季度增长后可能进一步回落。ISM制造业PMI指数长期处于萎缩区间，并在10月大幅下降了2.3个百分点。\n",
      "3. **就业市场降温**：10月新增非农就业人数较年内月度均值大幅减少，失业率提高至3.9%，工资增速放缓，在高通胀背景下，居民可支配收入增长逐渐承压。\n",
      "\n",
      "综上所述，多个关键经济指标显示美国经济增长动力在四季度有所减弱。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年10月美国ISM制造业PMI指数较上月有何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年10月美国ISM制造业PMI指数较上个月大幅下降2.3个百分点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年10月，美国ISM制造业PMI指数较上个月大幅下降了2.3个百分点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 目前情况下，哪种可能性更高，美国经济软着陆还是衰退？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': \"预计2024年美国经济增速将进一步回落，'软着陆'和衰退的可能性同时存在，但从目前情况看，'软着陆'发生的可能性要高于衰退。\", 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 根据报告中的分析，在当前情况下，“软着陆”发生的可能性要高于衰退。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 小企业信心的现状如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '当前小企业信心指数的具体数据、趋势变化或相关调查结果'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 当前小企业信心指数的具体数据、趋势变化或相关调查结果\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '小企业信心指数数据、当前主要经济体小企业信心调查结果、影响小企业信心的关键因素（如融资环境/市场需求/政策支持）的最新变化情况'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 小企业信心指数数据、当前主要经济体小企业信心调查结果、影响小企业信心的关键因素（如融资环境/市场需求/政策支持）的最新变化情况\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '具体的小企业信心指数数据、2023年各国小企业信心调查结果、当前影响小企业信心的关键因素（如融资成本、市场需求等）的最新数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 具体的小企业信心指数数据、2023年各国小企业信心调查结果、当前影响小企业信心的关键因素（如融资成本、市场需求等）的最新数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '小企业信心指数数据、近期调查结果、信心变化趋势或影响小企业信心的具体经济指标分析'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 小企业信心指数数据、近期调查结果、信心变化趋势或影响小企业信心的具体经济指标分析\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '当前小企业信心指数数据、小企业信心调查结果、影响小企业信心的具体因素（如融资环境/市场需求/政策支持等）的最新变化'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 5)===\n",
      "Searching for: 当前小企业信心指数数据、小企业信心调查结果、影响小企业信心的具体因素（如融资环境/市场需求/政策支持等）的最新变化\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 6)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '具体的小企业信心指数数据、相关调查统计报告、当前影响小企业信心的关键因素（如融资环境/市场需求/政策支持等）、分区域或分行业的小企业信心对比分析'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 6)===\n",
      "Searching for: 具体的小企业信心指数数据、相关调查统计报告、当前影响小企业信心的关键因素（如融资环境/市场需求/政策支持等）、分区域或分行业的小企业信心对比分析\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 7)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '小企业信心指数的最新数据、主要经济体小企业信心调查报告、影响小企业信心的关键因素（如融资环境/经营成本/市场需求等）'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 7)===\n",
      "Searching for: 小企业信心指数的最新数据、主要经济体小企业信心调查报告、影响小企业信心的关键因素（如融资环境/经营成本/市场需求等）\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 8)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '小企业信心指数数据或相关调查结果，如NFIB小企业信心指数、区域性小企业信心调查、融资环境收紧对小企业影响的具体分析等。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 8)===\n",
      "Searching for: 小企业信心指数数据或相关调查结果，如NFIB小企业信心指数、区域性小企业信心调查、融资环境收紧对小企业影响的具体分析等。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 9)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '美联储持续加息导致中小银行面临利率风险/资产负债表错配风险/市场风险和流动性风险，硅谷银行等案例显示融资环境收紧影响企业投资活动。', 'missing_information': '2023-2024年小企业信心指数具体数值、NFIB等机构的小企业商业信心调查报告、分行业/分地区的小企业信心变化趋势数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 9)===\n",
      "Searching for: 2023-2024年小企业信心指数具体数值、NFIB等机构的小企业商业信心调查报告、分行业/分地区的小企业信心变化趋势数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 10)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '美国企业投资可能持续疲软，房地产投资将从低位波动反弹；欧洲经济活动停滞，商业预期和新订单指数恶化。', 'missing_information': '直接提及小企业信心指数、当前小企业信心调查数据、中小企业经营预期变化的具体指标或报告'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 10)===\n",
      "Searching for: 直接提及小企业信心指数、当前小企业信心调查数据、中小企业经营预期变化的具体指标或报告\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 11)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '背景信息提到欧洲商业预期和新订单指数恶化，OECD消费者信心指数连续3个月回落', 'missing_information': '需要补充各国小企业信心指数最新数据、NFIB小型企业乐观指数现状、小企业主对经济前景的具体预期调查数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 11)===\n",
      "Searching for: 需要补充各国小企业信心指数最新数据、NFIB小型企业乐观指数现状、小企业主对经济前景的具体预期调查数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 12)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '背景信息提到欧洲商业预期和新订单指数恶化，OECD消费者信心指数连续3个月回落', 'missing_information': '具体的小企业信心指数数据（如当前数值、区域分布、历史对比）、专门针对小企业的PMI分项指标或调查报告'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 12)===\n",
      "Searching for: 具体的小企业信心指数数据（如当前数值、区域分布、历史对比）、专门针对小企业的PMI分项指标或调查报告\n",
      "e: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.\n",
      "For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/GRAPH_RECURSION_LIMIT, 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 8-10月消费者信心指数与长期平均水平相比如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '8-10月消费者信心指数持续下降，远低于长期平均水平', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 8-10月消费者信心指数持续下降，远低于长期平均水平。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 10月欧元区的PMI就业指数是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '10月欧元区PMI就业指数为49.4%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 10月欧元区的PMI就业指数为49.4%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 根据英国预算责任办公室的说法，英国民众生活标准何时会开始恢复？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出，以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%。', 'missing_information': '英国民众生活标准预计开始恢复的具体时间节点或后续财年预测数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 英国民众生活标准预计开始恢复的具体时间节点或后续财年预测数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出英国民众以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%。', 'missing_information': '英国预算责任办公室对生活标准恢复时间的具体预测或声明'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 英国预算责任办公室对生活标准恢复时间的具体预测或声明\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出英国民众以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国预算责任办公室对生活标准恢复至疫情前水平的具体时间预测'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 英国预算责任办公室对生活标准恢复至疫情前水平的具体时间预测\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出英国民众以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国生活标准预计开始恢复的具体时间节点或2024年之后的经济预测数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 英国生活标准预计开始恢复的具体时间节点或2024年之后的经济预测数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出英国民众生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '具体说明生活标准开始恢复的时间节点（如具体年份/季度）或触发恢复的关键条件'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 5)===\n",
      "Searching for: 具体说明生活标准开始恢复的时间节点（如具体年份/季度）或触发恢复的关键条件\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 6)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出英国民众生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国预算责任办公室对生活标准恢复时间的具体预测（如恢复的财年或时间节点）'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 6)===\n",
      "Searching for: 英国预算责任办公室对生活标准恢复时间的具体预测（如恢复的财年或时间节点）\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 7)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出，英国民众以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国预算责任办公室对生活标准恢复时间的具体预测（例如开始恢复的明确时间节点或触发恢复的条件）'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 7)===\n",
      "Searching for: 英国预算责任办公室对生活标准恢复时间的具体预测（例如开始恢复的明确时间节点或触发恢复的条件）\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 8)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出，英国民众以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国预算责任办公室对生活标准恢复至疫情前水平或开始回升的具体时间预测'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 8)===\n",
      "Searching for: 英国预算责任办公室对生活标准恢复至疫情前水平或开始回升的具体时间预测\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 9)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出，英国民众以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国预算责任办公室关于生活标准恢复时间的具体预测或官方声明'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 9)===\n",
      "Searching for: 英国预算责任办公室关于生活标准恢复时间的具体预测或官方声明\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 10)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出，英国民众以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国预算责任办公室对生活标准恢复时间的具体预测或相关经济复苏时间表'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 10)===\n",
      "Searching for: 英国预算责任办公室对生活标准恢复时间的具体预测或相关经济复苏时间表\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 11)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出，英国民众以可支配收入衡量的生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国生活标准开始恢复的具体时间节点（如2024年后某季度/年度）或预算责任办公室关于恢复时点的明确预测'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 11)===\n",
      "Searching for: 英国生活标准开始恢复的具体时间节点（如2024年后某季度/年度）或预算责任办公室关于恢复时点的明确预测\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 12)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '英国预算责任办公室指出英国民众生活标准在下一财年仍将较疫情前水平低3.5%', 'missing_information': '英国预算责任办公室对生活标准恢复时间的具体预测或声明'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 12)===\n",
      "Searching for: 英国预算责任办公室对生活标准恢复时间的具体预测或声明\n",
      "e: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.\n",
      "For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/GRAPH_RECURSION_LIMIT, 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 为什么说欧洲央行加息之路基本宣告结束？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧洲央行加息之路基本宣告结束的原因是通胀和经济双双降温，尤其是能源价格同比大幅回落11.1%，抵消了其他领域的价格压力，同时经济疲软导致高利率维持但不再加息。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 因为随着经济增长和通胀水平双双降温，欧元区经济下行程度超出市场预期，欧洲央行宣布本轮加息周期结束。尽管仍致力于实现2%的通货膨胀目标，但预计欧洲高利率水平将维持较长一段时间。这表明了欧洲央行对当前紧缩政策效果与经济疲软状况的权衡考虑后，认为进一步加息的空间有限或不再必要。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年10月欧元区经济景气指数是多少点?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势，但未明确2023年10月具体数值。', 'missing_information': '2023年10月欧盟经济景气指数的具体数值点'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2023年10月欧盟经济景气指数的具体数值点\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值；8-10月消费者信心指数持续下降，远低于长期平均水平', 'missing_information': '2023年10月欧元区经济景气指数的具体数值点'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值点\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数具体数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 2023年10月欧元区经济景气指数具体数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数的具体数值点'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值点\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数的具体数值点'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 5)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值点\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 6)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值；8-10月消费者信心指数持续下降，远低于长期平均水平', 'missing_information': '2023年10月欧元区经济景气指数具体数值数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 6)===\n",
      "Searching for: 2023年10月欧元区经济景气指数具体数值数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 7)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数的具体数值点'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 7)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值点\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 8)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数的具体数值点'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 8)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值点\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 9)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数的具体数值点'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 9)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值点\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 10)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数的具体数值点'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 10)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值点\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 11)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数的具体数值数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 11)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 12)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '图9提到欧元区综合PMI及欧盟经济景气指数走势但未明确2023年10月具体数值', 'missing_information': '2023年10月欧元区经济景气指数的具体数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 12)===\n",
      "Searching for: 2023年10月欧元区经济景气指数的具体数值\n",
      "e: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.\n",
      "For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/GRAPH_RECURSION_LIMIT, 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 预计2023年欧元区的经济增速大概是多少?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '预计2023年欧元区经济增长预期为0.6%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 预计2023年欧元区的经济增速较2022年下降1个百分点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年二季度沙特GDP的同比增长率是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年沙特经济增速预计仅为0.8%（全年预测值）', 'missing_information': '2023年二季度沙特GDP的季度同比具体数据，需补充沙特官方统计机构或IMF等国际组织发布的季度经济报告'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2023年二季度沙特GDP的季度同比具体数据，需补充沙特官方统计机构或IMF等国际组织发布的季度经济报告\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '沙特2023年经济增速预计仅为0.8%（全年预测值）', 'missing_information': '2023年二季度沙特GDP的同比增长率具体数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 2023年二季度沙特GDP的同比增长率具体数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年二季度沙特GDP同比增长1.2%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 3)===\n",
      "answer: 1.2%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年9月南非的CPI同比上涨了多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '南非2023年9月CPI同比上涨5.5%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 8.5%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年预计新兴经济体的整体经济增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '预计2024年新兴经济体整体经济增速将在4%左右，略高于2023年。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年新兴经济体整体经济增速将在4%左右。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在当前背景下，哪些国家需要发展可再生能源？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '海湾六国中需要发展可再生能源的国家包括阿联酋（2050年净零目标）、沙特、阿曼、科威特、巴林（2060年净零目标），以及卡塔尔（推进可再生能源项目）。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 海湾六国（沙特、阿联酋、科威特、巴林、卡塔尔和阿曼）面临较大的经济转型需求，包括但不限于：\n",
      "\n",
      "1. **全球能源危机**引发对能源安全的关注，导致主要经济体加快推动能源多元化发展。\n",
      "2. **应对气候变化**成为全球共识，加速了全球能源结构变革，绿色低碳发展意味着新能源将逐步取代传统能源份额。\n",
      "3. **国际社会对能源需求减少**，尤其是对石油的需求随着全球能源多样化发展的推进而逐步减少。\n",
      "4. **经济和人口增长**为工业和制造业扩张提供了空间，进一步坚定了这些国家经济转型的决心。\n",
      "\n",
      "为了适应这些变化并促进经济多元化发展，海湾六国已经采取了措施：\n",
      "\n",
      "- 设定净零排放目标，推动新能源转型和绿色经济发展。阿联酋承诺2050年实现净零排放，沙特、阿曼、科威特、巴林设定了2060年的类似目标。\n",
      "- 投资于太阳能、风能、氢能等可再生能源的基础设施建设。例如，沙特正在发展绿氢和绿氨生产项目，并计划每年减少约2000万吨碳排放；阿联酋通过马斯达尔在国内外开发氢能，计划到2031年实现140万吨氢气产量中的100万吨为绿色氢。\n",
      "- 吸引外国直接投资（FDI）流入领域愈发多元化。阿联酋的FDI主要流向运输和仓储、酒店与旅游、可再生能源、软件与IT服务以及消费品等领域。\n",
      "\n",
      "综上所述，海湾六国在当前全球能源转型的大背景下，通过设定净零排放目标、推动绿色经济和技术发展以及吸引多元化的外国直接投资等措施，积极应对挑战并促进经济增长。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在2023年的金砖会议上，中国宣布了什么专项资金？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '中国宣布推出100亿美元专项资金用于落实全球发展倡议。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 在2023年的金砖会议上，中国宣布推出100亿美元的专项资金用于落实全球发展倡议。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年美国的GDP增长率预测是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': \"预计2024年美国经济增速将进一步回落，'软着陆'和衰退的可能性同时存在，但'软着陆'发生的可能性要高于衰退。\", 'missing_information': '2024年美国GDP增长率的具体预测数值（百分比）'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2024年美国GDP增长率的具体预测数值（百分比）\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年美国GDP增长率预测为1.7%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 2024年美国的GDP增长率预测为1.7%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年中国的GDP增长率预测是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年中国GDP增长率预测为5.0%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年中国的GDP增长率预测为5.0%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年英国的GDP增长率估计是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%', 'missing_information': '2023年英国全年GDP增长率的具体数值或年度预测数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体数值或年度预测数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%', 'missing_information': '2023年英国全年GDP增长率的具体估计数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体估计数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%', 'missing_information': '2023年英国全年GDP增长率估计值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 2023年英国全年GDP增长率估计值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%', 'missing_information': '2023年英国全年GDP增长率的具体估计数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体估计数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%', 'missing_information': '2023年全年英国GDP增长率的具体估计数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 5)===\n",
      "Searching for: 2023年全年英国GDP增长率的具体估计数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 6)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%', 'missing_information': '2023年英国全年GDP增长率的具体估计数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 6)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体估计数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 7)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%；发达经济体2023年增速较2022年下降1个百分点，其中英国经济增速大幅下降。', 'missing_information': '2023年英国全年GDP增长率的具体数值或官方预测数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 7)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体数值或官方预测数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 8)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%；发达经济体2023年增速较2022年下降1个百分点，其中英国经济增速大幅下降。', 'missing_information': '2023年英国全年GDP增长率的具体数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 8)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 9)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%；发达经济体2023年增速较2022年下降1个百分点，其中英国经济增速大幅下降。', 'missing_information': '2023年英国全年GDP增长率的具体数值或官方估计值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 9)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体数值或官方估计值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 10)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%；发达经济体2023年增速较2022年下降1个百分点，其中英国经济增速大幅下降。', 'missing_information': '2023年英国全年GDP增长率的具体数值（非季度环比）'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 10)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体数值（非季度环比）\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 11)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%；发达经济体2023年增速较2022年下降1个百分点，其中英国经济增速大幅下降。', 'missing_information': '2023年英国全年GDP增长率的具体估计数值'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 11)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体估计数值\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 12)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2023年三季度英国GDP环比增速下降0.03%；发达经济体2023年增速较2022年下降1个百分点，其中英国经济增速大幅下降。', 'missing_information': '2023年英国全年GDP增长率的具体估计数值或官方预测数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 12)===\n",
      "Searching for: 2023年英国全年GDP增长率的具体估计数值或官方预测数据\n",
      "e: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.\n",
      "For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/GRAPH_RECURSION_LIMIT, 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 欧洲央行在何时宣布暂停加息？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧洲央行于2023年10月26日宣布暂停加息，这是自2022年7月以来首次暂停加息。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 欧洲央行在2023年10月26日宣布暂停加息。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 日本央行的基准利率在10月31日维持在多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '日本央行在2023年10月31日将基准利率维持在-0.1%的水平。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 日本央行为基准利率维持在-0.1%的水平。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 英国央行在2023年加息了多少次？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '英国央行在2023年加息5次，累计125个基点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 英国央行在2023年内连续加息5次。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美联储在2月1日的基点变动了多少?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '25', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 美联储在2月1日进行了25个基点的变动。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 欧洲央行在3月16日的利率是多少百分比?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧洲央行3月16日加息50基点后利率为3.5%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 5.5%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 英格兰银行在6月22日的利率变动了多少基点?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '英格兰银行在2023年6月22日加息50基点，变动后利率为5%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 英格兰银行在6月22日的利率变动了50基点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美国金融危机风险指标的英文缩写是什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国金融危机风险指标的英文缩写是ROFCI', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 美国金融危机风险指标的英文缩写是ROFCI（Risk of Financial Crisis Index）。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年，欧元区M3、M2和M1的同比增速情况是否提及？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧元区广义货币增速（M3）同比增速为-1.04%、M2为-2.03%、M1为-9.73%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 报告中提到了欧元区广义货币增速（M3），但未具体说明M2和M1的同比增速。同时提到在一些关键金融指标上出现了差异，这些差异主要由货币市场基金和发行债券规模的增长所致，并指出了证券回购、外汇远期等融资工具交投活跃的现象。对于欧元区M3的具体增速，报告通过图16进行了展示。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年瑞士法郎对美元的升值幅度是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '瑞士法郎在震荡中升值4.2%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 4.2%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美元的走势如何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美元在2024年前期保持强劲势头，之后将随着美联储货币政策转向逐步走弱，预计下半年呈现贬值态势。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 在报告中提到，美元在2024年前期展现出较强韧性，保持了较强的强势。然而，在之后会随着美联储货币政策的转向而逐步走弱，尤其是预计下半年美元汇率将呈现贬值态势。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 市场对美联储的预期是什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '美联储为应对通胀持续提高利率，导致中小银行承受更多利率风险、资产负债表错配风险、市场风险和流动性风险，并引发硅谷银行等倒闭事件。', 'missing_information': '市场对未来美联储货币政策调整的具体预期（如降息/加息时间点、幅度）、投资者情绪指标、利率期货市场数据、美联储点阵图预测等'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 市场对未来美联储货币政策调整的具体预期（如降息/加息时间点、幅度）、投资者情绪指标、利率期货市场数据、美联储点阵图预测等\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '市场对美联储的预期包括：1. 当前货币政策已达限制性水平；2. 加息周期临近尾声，2024年大概率调整货币政策；3. 若无特殊风险事件，2024年将维持当前缩表节奏。', 'missing_information': '美联储首次降息的具体时点和高利率的持续时间'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 市场基本达成共识，当前的货币政策已经达到“限制性”水平，并预测美联储在2024年会调整其货币政策。预计美联储加息周期接近尾声，且可能在该年内维持当前的缩表（量化紧缩，QT）节奏。此外，市场认为，在没有特殊风险事件发生的情况下，美联储可能会继续按照目前的速度进行缩表，同时存在不确定性的是高利率的持续时间和首次降息的具体时间点，以及潜在的货币政策“滞后效应”对经济的影响。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 欧元和英镑的汇率会怎样？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '预计2024年欧元和英镑汇率将震荡回落，下半年企稳回升，主要受欧元区和英国经济增长疲软及货币政策转向影响。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 预计2024年欧元和英镑汇率将震荡回落，下半年企稳回升。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 哪个行业的涨幅在2023年1月1日至2023年11月15日期间最高？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '信息科技MSCI指数涨幅最高，达41.1%（2023年1月1日至2023年11月15日）', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 信息显示，截至2023年11月15日，信息科技MSCI指数的涨幅为41.1%，高于电信业务（31.5%）和非日常消费品（21.5%），因此，在该期间内，信息科技行业的涨幅最高。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 图20的涨跌幅区间是什么时候？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间时间范围'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 图20的涨跌幅区间时间范围\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美联储加息导致商业和居住房地产风险排名从2023年5月的第四位上升至10月的第二位，仅次于持续通胀与货币政策紧缩风险。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 美联储加息导致商业和居住房地产风险的排名从2023年5月的第四位上升至10月的第二位，仅次于持续通胀与货币政策紧缩风险。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在居住房贷中，哪种类型的贷款占比较大？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '在居住房贷中，10-30年期固定利率类占比达89%，且绝大部分为30年房贷。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 在居住房贷中，10-30年期固定利率类占比达89%，且绝大部分为30年房贷。这意味着债务人月供负担低，加息不会增加存量房贷还款负担，并且新增房贷数量仍较有限。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: John Burns研究与咨询公司的调查结果显示，多少比例的计划购房者表示房贷利率高于5.5%就不再愿意购房？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '71%的计划购房者表示房贷利率高于5.5%则不愿购房。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 71%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在2024年美联储可能做什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美联储可能在2024年调整货币政策（加息周期临近尾声），维持当前缩表（QT）节奏，首次降息时点尚不确定。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 在2024年，美联储可能调整货币政策，并有可能维持当前的缩表（QT）节奏。市场基本共识是：目前的货币政策已经达到“限制性”水平；美联储加息周期已接近尾声；若无特殊风险事件发生，美联储可能在2024年维持当前的缩表速度。不确定性主要集中在高利率持续时间和首次降息的时间点上，以及潜在的货币政策滞后效应对经济的影响。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美国单一家庭房贷整体拖欠率在2023年二季度达到多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国单一家庭房贷整体拖欠率在2023年二季度达到1.7%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 1.7%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 疫情后美国商业房地产价格在2021年四季度的季度同比增幅是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2021年四季度美国商业房地产价格季度同比增幅达16.4%的历史高点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 疫情后美国商业房地产价格在2021年四季度的季度同比增幅达到16.4%的历史高点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年二季度，银行业的商业房地产贷款拖欠率是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年二季度银行业商业房地产贷款拖欠率季度平均值为0.8%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年二季度，银行业的商业房地产贷款拖欠率为0.8%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 商业房地产贷款在中小型银行资产中的占比大约是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '29%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 商业房地产贷款在中小银行资产中占比达29%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 对于2024年发达经济体的货币政策有什么预测？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美联储可能在2024年上半年停止加息；日本央行预计2024年初退出负利率政策并启动小幅加息；欧洲央行和英国央行已暂停加息，但维持高利率应对通胀；发达经济体货币政策将呈现分化态势。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年预计发达经济体的货币政策将呈现分化趋势。在面对“遏通胀和稳增长”的两难问题时，多数国家的政策利率将继续维持高位以应对通胀风险。然而，在经济下行压力加大的背景下，不同国家的央行货币政策走势将逐渐分化：\n",
      "\n",
      "- 美国方面：美联储可能在2024年上半年停止加息。\n",
      "\n",
      "- 日本央行：预计在通胀压力下，日本央行可能会于2024年初退出负利率政策。\n",
      "\n",
      "随着金融信贷条件的松动、市场风险和流动性风险的进一步降低，以及美国通胀水平持续下降且经济实现软着陆的预期，ROFCI（整体金融稳定性指标）将维持在不稳定和安全区域之间波动。这表明发达经济体的金融市场将在一定程度上增强稳定性。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 欧盟在认定补贴属于可诉性补贴后，可能会采取哪些措施？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧盟可能采取两类反补贴措施：一是加征差异化的反补贴税（不合作企业被征收最高税率），二是接受出口商价格承诺以不低于特定价格出口。反补贴措施一般实施五年。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 当欧盟认定补贴为可诉性补贴时，可能采取的措施包括加征反补贴税或要求出口商接受价格承诺。如果企业被认定为不合作，则适用较高的加征税率；而合作企业则需按照不低于特定的价格出口产品。这些反补贴措施通常执行五年。在以下三种情况下，欧盟可能会无措施结案：当欧盟认定补贴对内部产业未造成损害、补贴数额微小，或申请方撤诉时。从历史经验来看，欧盟发起的18起对华反补贴调查中，近三分之二最终采取了加征关税措施。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球发展中国家在哪些重要的国际会议上展露出活跃的表现？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': \"2023年发展中国家活跃的重要国际会议包括：上海合作组织成员国元首理事会第二十三次会议、中国－中亚峰会、金砖国家第十五次领导人会晤、第三届'一带一路'国际合作高峰论坛。\", 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年，全球发展中国家在以下重要国际会议中展现活跃：\n",
      "\n",
      "1. 上海合作组织成员国元首理事会第二十三次会议。\n",
      "2. 中国-中亚峰会。\n",
      "3. 金砖国家第十五次领导人会晤（金砖会议）。\n",
      "4. 第三届“一带一路”国际合作高峰论坛。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年美联储的货币政策预期如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美联储加息周期已临近尾声，大概率在2024年调整货币政策；若无特殊风险事件，可能维持当前缩表节奏，首次降息时点和高利率持续时间仍不确定。预计随着通胀下降及经济软着陆，市场风险和流动性风险降低，2024年下半年美元汇率或因降息预期呈现贬值态势。', 'missing_information': '具体首次降息的时间节点及触发条件、货币政策滞后效应的具体经济影响指标。'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年美联储的货币政策预期包括以下几个方面：\n",
      "\n",
      "1. 当前的货币政策已达到“限制性”水平；\n",
      "2. 美联储加息周期接近尾声，市场预计将在2024年调整货币政策；\n",
      "3. 若无特殊风险事件发生，美联储可能在2024年维持当前缩表（QT）节奏。\n",
      "\n",
      "不确定性主要在于高利率的持续时间和首次降息的时间点。此外，潜在的货币政策“滞后效应”对经济的影响也是不确定因素之一。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年全球资金状况和货币市场基金的前景如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': \"2024年全球资金将处于'紧平衡'状态，货币市场基金规模增速可能放缓。美国监管新规强化流动性资产比例要求，导致货币市场基金净值增长态势放缓，优质基金受影响更大。跨境资本回流美国趋势放缓，资金可能更多流向新兴经济体。\", 'missing_information': '具体区域货币市场基金增速的量化预测数据、不同经济体货币政策调整对资金流向的具体影响程度、新兴经济体资金流入的行业分布细节'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年，全球经济将经历资金\"紧平衡\"状态，主要经济体结束加息周期后，资金流动性将趋于稳定但相对紧张。这将导致：\n",
      "\n",
      "1. **货币市场利率维持高位**：美元SOFR、欧元€STR和英镑SONIA等短期基准利率预计将保持在政策利率附近，呈现小幅回落后仍处高位的态势。日元TONA则可能由负值转为正值。\n",
      "\n",
      "2. **交易活跃度高**：资金紧平衡将推动货币市场的短期资金成本上升，并增加部分金融机构期限错配风险和脆弱性。在极端情况下，这些机构可能会面临流动性冲击的风险增大。\n",
      "\n",
      "3. **\"去存款化\"现象延续**：全球广义货币增速有望提升，但美国等主要经济体的证券回购市场可能会出现“现券供给充裕，资金相对紧张”的特征。美国证券交易委员会的监管新规可能放缓美国货币市场基金规模的增长速度，尤其是优质货币市场基金。\n",
      "\n",
      "4. **跨境资本流动变化**：2024年全球范围内跨境资本流动趋势预计将发生调整。美国可能经历资本回流势头的放缓，日本则有望退出负利率政策。新兴经济体将吸引更多组合投资和其它投资资金，资金流向可能会加速向新兴市场转移。\n",
      "\n",
      "5. **货币市场基金规模增速可能放缓**：在全球资金紧平衡的影响下，美国货币市场基金净值增长速度预计会受到限制。监管加强和技术发展可能导致优质货币市场基金的扩张受到更大影响。\n",
      "\n",
      "综上所述，2024年的全球资金状况将主要围绕“紧平衡”状态展开，货币市场、跨境资本流动和货币市场基金都将面临新的挑战与机遇。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 面对经济增长放缓和全球经济挑战，海湾国家采取了什么措施？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '海湾国家推动绿色经济转型、经济多元化改革；沙特和阿联酋放宽外国投资者限制并促进公私合作；扩大主权财富基金在医疗、科技等新兴领域及亚太市场的投资。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 面对经济增长放缓和全球经济挑战，海湾六国采取了以下措施：\n",
      "\n",
      "1. **推动绿色经济转型**：沙特、阿联酋等国政府近年来大力推动绿色经济转型、推进经济多元化改革，以稳定经济发展。\n",
      "\n",
      "2. **促进公私合作伙伴关系和放宽外国投资者限制**：通过吸引外资来增强经济韧性。例如，沙特将油气管道49%的股权出售给美国EIGGlobalEnergyPartners公司，交易金额高达124亿美元。\n",
      "\n",
      "3. **扩大海外投资范围**：减少对石油和天然气的依赖，海湾六国的海外投资主要通过主权财富基金间接进行，在医疗、科技、互联网等新兴领域进行投资，并重点向中国等亚太市场转移。阿布扎比投资局对华投资占比显著增加。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 浮动利率房贷在新增房贷中的占比有何变化，为什么会有这种变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '浮动利率房贷在新增房贷中的占比上升。原因是预期30年房贷利率将在2025年一季度下降到6.4%，且浮动利率比固定利率低100个基点以上，可减轻债务人还款负担。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 浮动利率房贷在新增房贷中的占比上升了。这是因为30年固定利率房贷的平均利率预计将下降到6.4%，相比固定利率低100个基点以上（即约6.4% - 5.4%=1%）。采用浮动利率贷款的申请者能够进一步减轻还款负担，因此在新增房贷中所占比例上升。\n"
     ]
    }
   ],
   "source": [
    "for idx, row in tqdm(prediction_df.iterrows(), total=len(prediction_df)):\n",
    "    uuid = row['uuid']\n",
    "    question = row['question']\n",
    "    if question in finished_questions:\n",
    "        continue\n",
    "\n",
    "    fallback = 0\n",
    "    compiled_graph = workflow.compile()\n",
    "    try:\n",
    "        result = compiled_graph.invoke({'question': question})\n",
    "        answer = result['answer_to_question']\n",
    "    except Exception as e:\n",
    "        print(f\"e: {e}, 兜底\")\n",
    "        fallback = 1\n",
    "        answer, _ = rag(llm, question)\n",
    "    \n",
    "    answer_dict[question] = {\n",
    "        'uuid': uuid,\n",
    "        'ref_answer': row['ref_answer'],\n",
    "        'gen_answer': answer,\n",
    "        'fallback': fallback\n",
    "    }\n",
    "    finished_questions.add(question)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "1bd822e7-e3ca-4906-ab7d-6af479502dce",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:05:25.316879Z",
     "iopub.status.busy": "2025-03-08T18:05:25.316748Z",
     "iopub.status.idle": "2025-03-08T18:05:25.320477Z",
     "shell.execute_reply": "2025-03-08T18:05:25.320157Z",
     "shell.execute_reply.started": "2025-03-08T18:05:25.316866Z"
    }
   },
   "outputs": [],
   "source": [
    "prediction_df.loc[:, 'gen_answer'] = prediction_df['question'].apply(lambda q: answer_dict[q]['gen_answer'])\n",
    "prediction_df.loc[:, 'fallback'] = prediction_df['question'].apply(lambda q: answer_dict[q]['fallback'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "f436e6d9-f4d5-4ba7-821a-4fe80df33f58",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:05:25.321200Z",
     "iopub.status.busy": "2025-03-08T18:05:25.320912Z",
     "iopub.status.idle": "2025-03-08T18:05:25.332952Z",
     "shell.execute_reply": "2025-03-08T18:05:25.332586Z",
     "shell.execute_reply.started": "2025-03-08T18:05:25.321188Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['fallback'].sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf9cecdc-c5f7-4edb-ab5b-382ca1ff5b75",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "bbd39436-ddec-4ea9-b963-5736d61e2186",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:05:25.333510Z",
     "iopub.status.busy": "2025-03-08T18:05:25.333389Z",
     "iopub.status.idle": "2025-03-08T18:05:25.348239Z",
     "shell.execute_reply": "2025-03-08T18:05:25.347793Z",
     "shell.execute_reply.started": "2025-03-08T18:05:25.333498Z"
    }
   },
   "outputs": [],
   "source": [
    "from langchain_openai import ChatOpenAI\n",
    "import time\n",
    "\n",
    "judge_llm = ChatOpenAI(\n",
    "    api_key=os.environ['LLM_API_KEY'],\n",
    "    base_url=os.environ['LLM_BASE_URL'],\n",
    "    model_name='qwen2-72b-instruct',\n",
    "    temperature=0\n",
    ")\n",
    "\n",
    "def evaluate(prediction_df):\n",
    "    \"\"\"\n",
    "    对预测结果进行打分\n",
    "    :param prediction_df: 预测结果，需要包含问题，参考答案，生成的答案，列名分别为question, ref_answer, gen_answer\n",
    "    :return 打分模型原始返回结果\n",
    "    \"\"\"\n",
    "    prompt_tmpl = \"\"\"\n",
    "你是一个经济学博士，现在我有一系列问题，有一个助手已经对这些问题进行了回答，你需要参照参考答案，评价这个助手的回答是否正确，仅回复“是”或“否”即可，不要带其他描述性内容或无关信息。\n",
    "问题：\n",
    "<question>\n",
    "{{question}}\n",
    "</question>\n",
    "\n",
    "参考答案：\n",
    "<ref_answer>\n",
    "{{ref_answer}}\n",
    "</ref_answer>\n",
    "\n",
    "助手回答：\n",
    "<gen_answer>\n",
    "{{gen_answer}}\n",
    "</gen_answer>\n",
    "请评价：\n",
    "    \"\"\"\n",
    "    results = []\n",
    "\n",
    "    for _, row in prediction_df.iterrows():\n",
    "        question = row['question']\n",
    "        ref_answer = row['ref_answer']\n",
    "        gen_answer = row['gen_answer']\n",
    "\n",
    "        prompt = prompt_tmpl.replace('{{question}}', question).replace('{{ref_answer}}', str(ref_answer)).replace('{{gen_answer}}', gen_answer).strip()\n",
    "        \n",
    "        retry_count = 3\n",
    "        result = ''\n",
    "        \n",
    "        while retry_count > 0:\n",
    "            try:\n",
    "                result = judge_llm.invoke(prompt).content\n",
    "                break\n",
    "            except Exception as e:\n",
    "                retry_count -= 1\n",
    "                sleeping_seconds = 2 ** (4 - retry_count)\n",
    "                print(f\"query={query}, error={e}, sleeping={sleeping_seconds}, remaining retry count={retry_count}\")\n",
    "                \n",
    "                time.sleep(sleeping_seconds)\n",
    "        \n",
    "        results.append(result)\n",
    "\n",
    "        time.sleep(1)\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "da5034d6-0e05-4dca-a032-0ce0d0e0ede4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:05:25.350945Z",
     "iopub.status.busy": "2025-03-08T18:05:25.350813Z",
     "iopub.status.idle": "2025-03-08T18:07:58.881789Z",
     "shell.execute_reply": "2025-03-08T18:07:58.879386Z",
     "shell.execute_reply.started": "2025-03-08T18:05:25.350932Z"
    }
   },
   "outputs": [],
   "source": [
    "prediction_df['raw_score'] = evaluate(prediction_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "faaabdb2-e223-4641-8646-377709eafc65",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:07:58.885072Z",
     "iopub.status.busy": "2025-03-08T18:07:58.884334Z",
     "iopub.status.idle": "2025-03-08T18:07:58.890807Z",
     "shell.execute_reply": "2025-03-08T18:07:58.890493Z",
     "shell.execute_reply.started": "2025-03-08T18:07:58.884999Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['是', '否'], dtype=object)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['raw_score'].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "1b9e7b50-fcd7-49e3-82a8-b0d4ce79cf83",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:07:58.891378Z",
     "iopub.status.busy": "2025-03-08T18:07:58.891217Z",
     "iopub.status.idle": "2025-03-08T18:07:58.902139Z",
     "shell.execute_reply": "2025-03-08T18:07:58.901642Z",
     "shell.execute_reply.started": "2025-03-08T18:07:58.891366Z"
    }
   },
   "outputs": [],
   "source": [
    "prediction_df['score'] = (prediction_df['raw_score'] == '是').astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "dfe16d77-ecb5-40b5-8955-41cbe1397574",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:07:58.902829Z",
     "iopub.status.busy": "2025-03-08T18:07:58.902582Z",
     "iopub.status.idle": "2025-03-08T18:07:58.909175Z",
     "shell.execute_reply": "2025-03-08T18:07:58.908757Z",
     "shell.execute_reply.started": "2025-03-08T18:07:58.902812Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.72"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['score'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "6cb0d9f8-1ecf-4541-987b-96e32b34cefe",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:07:58.909851Z",
     "iopub.status.busy": "2025-03-08T18:07:58.909692Z",
     "iopub.status.idle": "2025-03-08T18:07:58.916740Z",
     "shell.execute_reply": "2025-03-08T18:07:58.916313Z",
     "shell.execute_reply.started": "2025-03-08T18:07:58.909835Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "72"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['score'].sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "aaba866e-3824-4103-9426-23a4777bc23b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:07:58.917753Z",
     "iopub.status.busy": "2025-03-08T18:07:58.917316Z",
     "iopub.status.idle": "2025-03-08T18:07:58.923007Z",
     "shell.execute_reply": "2025-03-08T18:07:58.922372Z",
     "shell.execute_reply.started": "2025-03-08T18:07:58.917731Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['fallback'].sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92610680-ad56-4d82-b289-0b984e202239",
   "metadata": {},
   "source": [
    "有4条发生兜底"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "96ce13dd-fd6c-46b6-ba96-35dc3c8a8bd9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T18:07:58.923748Z",
     "iopub.status.busy": "2025-03-08T18:07:58.923548Z",
     "iopub.status.idle": "2025-03-08T18:07:59.295975Z",
     "shell.execute_reply": "2025-03-08T18:07:59.295618Z",
     "shell.execute_reply.started": "2025-03-08T18:07:58.923729Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='fallback', ylabel='score'>"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAhPUlEQVR4nO3dfXST9f3/8VdbaIqDhJtKChgtCBtsYEEosaBnA4KduipMz+rNsQXvppOKZJxBBVu/MqwbN6JrlYl6kD8YdSgcz2R1JVvn0fVYaa3OWUBQLAMTqNgGimuxye8Pj9mvo2Ab2l7th+fjnJxjPlxXrnc8B/P0ypUkJhwOhwUAAGCIWKsHAAAA6EzEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACM0sfqAbpbKBTS4cOHNWDAAMXExFg9DgAAaIdwOKzjx49r+PDhio09+7mZ8y5uDh8+LJfLZfUYAAAgCgcPHtRFF1101m3Ou7gZMGCApK//5djtdounAQAA7REMBuVyuSKv42dz3sXNN29F2e124gYAgF6mPZeUcEExAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjGJp3LzxxhvKyMjQ8OHDFRMTo+3bt3/rPmVlZbr88stls9k0evRobdy4scvnBAAAvYelcdPY2KiUlBQVFRW1a/tPPvlE1113nWbMmKHq6mo9+OCDuuuuu/T666938aQAAKC3sPSHM6+55hpdc8017d5+/fr1GjlypNasWSNJGjdunN5880098cQTSk9P76oxo/LFF19YPcI5CYVCCgaDVo+B/2G32xUb23vfTR40aJDVIwA4D/SqXwUvLy+Xx+NptZaenq4HH3zwjPs0NTWpqakpcr+7XrDnzp3bLccBepOysjKrRwBwHuhV/wvo9/vldDpbrTmdTgWDQX355Zdt7lNQUCCHwxG5uVyu7hgVAABYpFeduYlGbm6uvF5v5H4wGOyWwNm2bVuXH6Mr8bZUz9Tb35YCgO7Qq+ImKSlJgUCg1VogEJDdble/fv3a3Mdms8lms3XHeK2YcG3BkCFDrB4BAIAO61X/C5iWliafz9dqrbS0VGlpaRZNBAAAehpL4+bEiROqrq5WdXW1pK8/6l1dXa3a2lpJX7+llJWVFdn+3nvv1ccff6xf/epX2r17t55++mm99NJLWrRokRXjAwCAHsjSuNm1a5cmTZqkSZMmSZK8Xq8mTZqkvLw8SdJnn30WCR1JGjlypF577TWVlpYqJSVFa9as0XPPPdfjPgYOAACsExMOh8NWD9GdgsGgHA6HGhoaZLfbrR4HAAC0Q0dev3vVNTcAAADfhrgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGMXyuCkqKlJycrISEhLkdrtVUVFx1u3XrVun733ve+rXr59cLpcWLVqk//znP900LQAA6OksjZvi4mJ5vV7l5+erqqpKKSkpSk9P15EjR9rcfvPmzVq6dKny8/NVU1Oj559/XsXFxXrooYe6eXIAANBTxYTD4bBVB3e73UpNTVVhYaEkKRQKyeVyKScnR0uXLj1t+wULFqimpkY+ny+y9stf/lJvv/223nzzzTaP0dTUpKampsj9YDAol8ulhoYG2e32Tn5GAACgKwSDQTkcjna9flt25qa5uVmVlZXyeDz/HSY2Vh6PR+Xl5W3uM23aNFVWVkbeuvr444+1Y8cOXXvttWc8TkFBgRwOR+Tmcrk694kAAIAepY9VB66rq1NLS4ucTmerdafTqd27d7e5z6233qq6ujpdeeWVCofD+uqrr3Tvvfee9W2p3Nxceb3eyP1vztwAAAAzWX5BcUeUlZXpscce09NPP62qqiq98soreu2117RixYoz7mOz2WS321vdAACAuSw7c5OYmKi4uDgFAoFW64FAQElJSW3u8/DDD+v222/XXXfdJUmaMGGCGhsbdc8992jZsmWKje1VrQYAALqAZTUQHx+vyZMnt7o4OBQKyefzKS0trc19Tp48eVrAxMXFSZIsvC4aAAD0IJaduZEkr9er7OxsTZkyRVOnTtW6devU2Nio+fPnS5KysrI0YsQIFRQUSJIyMjK0du1aTZo0SW63W/v27dPDDz+sjIyMSOQAAIDzm6Vxk5mZqaNHjyovL09+v18TJ05USUlJ5CLj2traVmdqli9frpiYGC1fvlyHDh3ShRdeqIyMDK1cudKqpwAAAHoYS7/nxgod+Zw8AADoGXrF99wAAAB0BeIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFEsj5uioiIlJycrISFBbrdbFRUVZ92+vr5e999/v4YNGyabzabvfve72rFjRzdNCwAAero+Vh68uLhYXq9X69evl9vt1rp165Senq49e/Zo6NChp23f3Nys2bNna+jQodq6datGjBihTz/9VAMHDuz+4QEAQI8UEw6Hw1Yd3O12KzU1VYWFhZKkUCgkl8ulnJwcLV269LTt169fr1WrVmn37t3q27dvu47R1NSkpqamyP1gMCiXy6WGhgbZ7fbOeSIAAKBLBYNBORyOdr1+W/a2VHNzsyorK+XxeP47TGysPB6PysvL29zn1VdfVVpamu6//345nU6NHz9ejz32mFpaWs54nIKCAjkcjsjN5XJ1+nMBAAA9h2VxU1dXp5aWFjmdzlbrTqdTfr+/zX0+/vhjbd26VS0tLdqxY4cefvhhrVmzRr/+9a/PeJzc3Fw1NDREbgcPHuzU5wEAAHoWS6+56ahQKKShQ4fq2WefVVxcnCZPnqxDhw5p1apVys/Pb3Mfm80mm83WzZMCAACrWBY3iYmJiouLUyAQaLUeCASUlJTU5j7Dhg1T3759FRcXF1kbN26c/H6/mpubFR8f36UzAwCAns+yt6Xi4+M1efJk+Xy+yFooFJLP51NaWlqb+0yfPl379u1TKBSKrO3du1fDhg0jbAAAgCSLv+fG6/Vqw4YNevHFF1VTU6P77rtPjY2Nmj9/viQpKytLubm5ke3vu+8+HTt2TAsXLtTevXv12muv6bHHHtP9999v1VMAAAA9jKXX3GRmZuro0aPKy8uT3+/XxIkTVVJSErnIuLa2VrGx/+0vl8ul119/XYsWLdJll12mESNGaOHChVqyZIlVTwEAAPQwln7PjRU68jl5AADQM/SK77kBAADoCsQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMErUcVNfX6/nnntOubm5OnbsmCSpqqpKhw4d6rThAAAAOiqqH858//335fF45HA4dODAAd19990aPHiwXnnlFdXW1mrTpk2dPScAAEC7RHXmxuv1at68efroo4+UkJAQWb/22mv1xhtvdNpwAAAAHRVV3Lzzzjv6+c9/ftr6iBEj5Pf7z3koAACAaEUVNzabTcFg8LT1vXv36sILLzznoQAAAKIVVdxcf/31evTRR3Xq1ClJUkxMjGpra7VkyRLdeOONnTogAABAR0QVN2vWrNGJEyc0dOhQffnll/rhD3+o0aNHa8CAAVq5cmVnzwgAANBuUX1ayuFwqLS0VG+99Zbee+89nThxQpdffrk8Hk9nzwcAANAhHY6bU6dOqV+/fqqurtb06dM1ffr0rpgLAAAgKh1+W6pv3766+OKL1dLS0hXzAAAAnJOorrlZtmyZHnroocg3EwMAAPQUUV1zU1hYqH379mn48OG65JJL9J3vfKfVn1dVVXXKcAAAAB0VVdzMmTOnk8cAAADoHDHhcDhs9RDdKRgMyuFwqKGhQXa73epxAABAO3Tk9TuqMzffqKysVE1NjSTpBz/4gSZNmnQuDwcAAHDOooqbI0eO6Oabb1ZZWZkGDhwoSaqvr9eMGTO0ZcsWfoIBAABYJqpPS+Xk5Oj48eP617/+pWPHjunYsWP64IMPFAwG9cADD3T2jAAAAO0W1TU3DodDO3fuVGpqaqv1iooKXX311aqvr++s+Tod19wAAND7dOT1O6ozN6FQSH379j1tvW/fvgqFQtE8JAAAQKeIKm5mzpyphQsX6vDhw5G1Q4cOadGiRZo1a1anDQcAANBRUcVNYWGhgsGgkpOTdemll+rSSy/VyJEjFQwG9bvf/a6zZwQAAGi3qD4t5XK5VFVVpZ07d2r37t2SpHHjxvGr4AAAwHJ8iR8AAOjxuvyC4gceeEBPPfXUaeuFhYV68MEHo3lIAACAThFV3Lz88suaPn36aevTpk3T1q1bz3koAACAaEUVN59//rkcDsdp63a7XXV1dec8FAAAQLSiipvRo0erpKTktPU///nPGjVq1DkPBQAAEK2oPi3l9Xq1YMECHT16VDNnzpQk+Xw+rV69Wk8++WSnDggAANARUcXNHXfcoaamJq1cuVIrVqyQJI0cOVLr169XVlZWpw4IAADQEVG9LfXll18qOztb//73vxUIBPT+++9rwYIFcjqdnT0fAABAh0QVNzfccIM2bdok6evfk/J4PFq7dq3mzJmjZ555plMHBAAA6Iio4qaqqkpXXXWVJGnr1q1yOp369NNPtWnTpja//wYAAKC7RBU3J0+e1IABAyRJf/nLX/TTn/5UsbGxuuKKK/Tpp5926oAAAAAdEfVHwbdv366DBw/q9ddf19VXXy1JOnLkCD9pAAAALBVV3OTl5Wnx4sVKTk6W2+1WWlqapK/P4kyaNKlTBwQAAOiIqH840+/367PPPlNKSopiY79upIqKCtntdo0dO7ZTh+xM/HAmAAC9T0dev6P6nhtJSkpKUlJSUqu1qVOnRvtwAAAAnSKqt6UAAAB6KuIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYJQeETdFRUVKTk5WQkKC3G63Kioq2rXfli1bFBMTozlz5nTtgAAAoNewPG6Ki4vl9XqVn5+vqqoqpaSkKD09XUeOHDnrfgcOHNDixYt11VVXddOkAACgN7A8btauXau7775b8+fP1/e//32tX79eF1xwgV544YUz7tPS0qLbbrtN//d//6dRo0Z147QAAKCnszRumpubVVlZKY/HE1mLjY2Vx+NReXn5Gfd79NFHNXToUN15553feoympiYFg8FWNwAAYC5L46aurk4tLS1yOp2t1p1Op/x+f5v7vPnmm3r++ee1YcOGdh2joKBADocjcnO5XOc8NwAA6Lksf1uqI44fP67bb79dGzZsUGJiYrv2yc3NVUNDQ+R28ODBLp4SAABYqY+VB09MTFRcXJwCgUCr9UAgoKSkpNO2379/vw4cOKCMjIzIWigUkiT16dNHe/bs0aWXXtpqH5vNJpvN1gXTAwCAnsjSMzfx8fGaPHmyfD5fZC0UCsnn8yktLe207ceOHat//vOfqq6ujtyuv/56zZgxQ9XV1bzlBAAArD1zI0ler1fZ2dmaMmWKpk6dqnXr1qmxsVHz58+XJGVlZWnEiBEqKChQQkKCxo8f32r/gQMHStJp6wAA4PxkedxkZmbq6NGjysvLk9/v18SJE1VSUhK5yLi2tlaxsb3q0iAAAGChmHA4HLZ6iO4UDAblcDjU0NAgu91u9TgAAKAdOvL6zSkRAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFF6RNwUFRUpOTlZCQkJcrvdqqioOOO2GzZs0FVXXaVBgwZp0KBB8ng8Z90eAACcXyyPm+LiYnm9XuXn56uqqkopKSlKT0/XkSNH2ty+rKxMt9xyi/72t7+pvLxcLpdLV199tQ4dOtTNkwMAgJ4oJhwOh60cwO12KzU1VYWFhZKkUCgkl8ulnJwcLV269Fv3b2lp0aBBg1RYWKisrKxv3T4YDMrhcKihoUF2u/2c5wcAAF2vI6/flp65aW5uVmVlpTweT2QtNjZWHo9H5eXl7XqMkydP6tSpUxo8eHCbf97U1KRgMNjqBgAAzGVp3NTV1amlpUVOp7PVutPplN/vb9djLFmyRMOHD28VSP+/goICORyOyM3lcp3z3AAAoOey/Jqbc/H4449ry5Yt2rZtmxISEtrcJjc3Vw0NDZHbwYMHu3lKAADQnfpYefDExETFxcUpEAi0Wg8EAkpKSjrrvqtXr9bjjz+unTt36rLLLjvjdjabTTabrVPmBQAAPZ+lZ27i4+M1efJk+Xy+yFooFJLP51NaWtoZ9/vtb3+rFStWqKSkRFOmTOmOUQEAQC9h6ZkbSfJ6vcrOztaUKVM0depUrVu3To2NjZo/f74kKSsrSyNGjFBBQYEk6Te/+Y3y8vK0efNmJScnR67N6d+/v/r372/Z8wAAAD2D5XGTmZmpo0ePKi8vT36/XxMnTlRJSUnkIuPa2lrFxv73BNMzzzyj5uZm3XTTTa0eJz8/X4888kh3jg4AAHogy7/nprvxPTcAAPQ+veZ7bgAAADobcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAo/SxegCgK/3oRz+K/HNZWZllcwAAuk+POHNTVFSk5ORkJSQkyO12q6Ki4qzb//GPf9TYsWOVkJCgCRMmaMeOHd00KXqTlStXnvU+AMBMlsdNcXGxvF6v8vPzVVVVpZSUFKWnp+vIkSNtbv+Pf/xDt9xyi+688069++67mjNnjubMmaMPPvigmydHT1daWnrW+wAAM8WEw+GwlQO43W6lpqaqsLBQkhQKheRyuZSTk6OlS5eetn1mZqYaGxv1pz/9KbJ2xRVXaOLEiVq/fv23Hi8YDMrhcKihoUF2u73zngh6lFmzZqmlpeW09bi4OPl8Pgsmgkm++OILq0c4J6FQSMFg0Oox8D/sdrtiYy0/5xC1QYMGdenjd+T129Jrbpqbm1VZWanc3NzIWmxsrDwej8rLy9vcp7y8XF6vt9Vaenq6tm/f3ub2TU1NampqitznL7T5AoFAm2EjSS0tLQoEAnI6nd08FUwyd+5cq0cAepyedF2jpYlYV1enlpaW015onE6n/H5/m/v4/f4ObV9QUCCHwxG5uVyuzhkePVZmZuY5/TkAoHcz/tNSubm5rc70BINBAsdwxcXFZw2Y4uLibpwGJtq2bZvVI5wT3pbqmXr721I9iaVxk5iYqLi4OAUCgVbrgUBASUlJbe6TlJTUoe1tNptsNlvnDIxewel0Ki4u7ozX3PCWFM5VV19b0B2GDBli9QhAl7E0EePj4zV58uRWF3iGQiH5fD6lpaW1uU9aWtppF4SWlpaecXucn8500TAXEwOA+Sw//+X1erVhwwa9+OKLqqmp0X333afGxkbNnz9fkpSVldXqguOFCxeqpKREa9as0e7du/XII49o165dWrBggVVPAT3U7Nmzz3ofAGAmy6+5yczM1NGjR5WXlye/36+JEyeqpKQk8tZBbW1tq/cgp02bps2bN2v58uV66KGHNGbMGG3fvl3jx4+36imgh1q2bFmr77ZZtmyZhdMAALqL5d9z0934nhsAAHqfjrx+W/62FAAAQGcibgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGsfznF7rbN1/IHAwGLZ4EAAC01zev2+35YYXzLm6OHz8uSXK5XBZPAgAAOur48eNyOBxn3ea8+22pUCikw4cPa8CAAYqJibF6HHSxYDAol8ulgwcP8ltigGH4+31+CYfDOn78uIYPH97qB7Xbct6duYmNjdVFF11k9RjoZna7nf/4AYbi7/f549vO2HyDC4oBAIBRiBsAAGAU4gZGs9lsys/Pl81ms3oUAJ2Mv984k/PugmIAAGA2ztwAAACjEDcAAMAoxA0AADAKcQMAAIxC3MBoRUVFSk5OVkJCgtxutyoqKqweCcA5euONN5SRkaHhw4crJiZG27dvt3ok9DDEDYxVXFwsr9er/Px8VVVVKSUlRenp6Tpy5IjVowE4B42NjUpJSVFRUZHVo6CH4qPgMJbb7VZqaqoKCwslff27Yi6XSzk5OVq6dKnF0wHoDDExMdq2bZvmzJlj9SjoQThzAyM1NzersrJSHo8nshYbGyuPx6Py8nILJwMAdDXiBkaqq6tTS0uLnE5nq3Wn0ym/32/RVACA7kDcAAAAoxA3MFJiYqLi4uIUCARarQcCASUlJVk0FQCgOxA3MFJ8fLwmT54sn88XWQuFQvL5fEpLS7NwMgBAV+tj9QBAV/F6vcrOztaUKVM0depUrVu3To2NjZo/f77VowE4BydOnNC+ffsi9z/55BNVV1dr8ODBuvjiiy2cDD0FHwWH0QoLC7Vq1Sr5/X5NnDhRTz31lNxut9VjATgHZWVlmjFjxmnr2dnZ2rhxY/cPhB6HuAEAAEbhmhsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAN0iHA7rnnvu0eDBgxUTE6Pq6uqzbn/gwIFW25WVlSkmJkb19fWSpI0bN2rgwIFdOvP/HhNA78BvSwHoFiUlJdq4caPKyso0atQoJSYmWj0SAEMRNwC6xf79+zVs2DBNmzbN6lEAGI63pQB0uXnz5iknJ0e1tbWKiYlRcnKySkpKdOWVV2rgwIEaMmSIfvKTn2j//v0dfuzt27drzJgxSkhIUHp6ug4ePBj5s/379+uGG26Q0+lU//79lZqaqp07d7bav6mpSUuWLJHL5ZLNZtPo0aP1/PPPt3mskydP6pprrtH06dN5qwrowYgbAF3uySef1KOPPqqLLrpIn332md555x01NjbK6/Vq165d8vl8io2N1dy5cxUKhdr9uCdPntTKlSu1adMmvfXWW6qvr9fNN98c+fMTJ07o2muvlc/n07vvvqsf//jHysjIUG1tbWSbrKws/eEPf9BTTz2lmpoa/f73v1f//v1PO1Z9fb1mz56tUCik0tLSLr/eB0D0eFsKQJdzOBwaMGCA4uLilJSUJEm68cYbW23zwgsv6MILL9SHH36o8ePHt+txT506pcLCQrndbknSiy++qHHjxqmiokJTp05VSkqKUlJSItuvWLFC27Zt06uvvqoFCxZo7969eumll1RaWiqPxyNJGjVq1GnH8fv9yszM1JgxY7R582bFx8dH9e8BQPfgzA0AS3z00Ue65ZZbNGrUKNntdiUnJ0tSq7Mq36ZPnz5KTU2N3B87dqwGDhyompoaSV+fuVm8eLHGjRungQMHqn///qqpqYkco7q6WnFxcfrhD3941uPMnj1bo0ePVnFxMWED9AKcuQFgiYyMDF1yySXasGGDhg8frlAopPHjx6u5ubnTjrF48WKVlpZq9erVGj16tPr166ebbropcox+/fq163Guu+46vfzyy/rwww81YcKETpsPQNfgzA2Abvf5559rz549Wr58uWbNmqVx48bpiy++6PDjfPXVV9q1a1fk/p49e1RfX69x48ZJkt566y3NmzdPc+fO1YQJE5SUlKQDBw5Etp8wYYJCoZD+/ve/n/U4jz/+uLKzszVr1ix9+OGHHZ4TQPcibgB0u0GDBmnIkCF69tlntW/fPv31r3+V1+vt8OP07dtXOTk5evvtt1VZWal58+bpiiuu0NSpUyVJY8aM0SuvvKLq6mq99957uvXWW1tdsJycnKzs7Gzdcccd2r59uz755BOVlZXppZdeOu1Yq1ev1m233aaZM2dq9+7d0T95AF2OuAHQ7WJjY7VlyxZVVlZq/PjxWrRokVatWtXhx7ngggu0ZMkS3XrrrZo+fbr69++v4uLiyJ+vXbtWgwYN0rRp05SRkaH09HRdfvnlrR7jmWee0U033aRf/OIXGjt2rO6++241Nja2ebwnnnhCP/vZzzRz5kzt3bu3w/MC6B4x4XA4bPUQAAAAnYUzNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIzy/wDCgcPrFYUiywAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "\n",
    "sns.boxplot(x='fallback', y='score', data=prediction_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4afd6be2-1e82-4a33-b3f5-aad93976f8cf",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
